Nodejs로 외부 링크 이미지 저장하기

강민혁·2023년 6월 26일
0

프로젝트

목록 보기
7/7
post-thumbnail

이번 포스팅에서는 이전에 진행하던 롤 숙련도 검색사이트 개발중 생긴 문제점인 외부 이미지 저장에 대하여 포스팅 하겠습니다.

외부 링크 이미지

라이엇 게임즈에서 지원하는 API중 챔피언들의 이미지를 가져올 수 있는 링크가 있어서 접근하여 보았습니다.

http://ddragon.leagueoflegends.com/cdn/13.12.1/img/champion/Aatrox.png

위 링크로 접근시 이미지가 나올것입니다.
링크 맨 뒤쪽의 Aatrox.png 가 보이실텐데
[챔피언이름].png 를 입력하면 해당 챔피언의 사진이 나오게 됩니다 영어입니다.

저는 이것을 이용해 리그오브 레전드의 모든 챔피언의 이미지를 한번에 가져올 것입니다.

외부링크 이미지 다운로드하기

app.get('/img/download', (req, res) => {
    for (let i = 0; i <= 161; i++) {
        const imageUrl = `http://ddragon.leagueoflegends.com/cdn/13.12.1/img/champion/${req.query[i]}.png`;
        const imagePath = `championImgs/${req.query[i]}.png`;

        axios({
            url: imageUrl,
            responseType: 'stream',
        })
            .then((response) => {
                response.data.pipe(fs.createWriteStream(imagePath))
                    .on('finish', () => {
                        console.log('Image saved successfully.');
                    })
                    .on('error', (err) => {
                        console.error('Error saving image:', err);
                    });
            })
            .catch((err) => {
                console.error('Error downloading image:', err);
            });
    }
})

위 코드를 이용해 반복문을 수행하여 모든 챔피언의 사진을 가져올 것입니다.

req.query[i]는 제가 작성한 프론트엔드 로직에서 axios요청을 보내고
그안에 파라미터로 모든 챔피언의 이름이 담겨있습니다 (Aatrox.png) 이런식으로 담겨있습니다.

이것을 이용해 저장을 시도해보겠습니다.

성공적으로 다운로드가 된 모습을 보실 수 있습니다.

req.query[i]안에 모든 챔피언의 데이터가 있다고 생각하면 될 것 같습니다.

웹 화면에 map을한다면 이런식으로 뿌릴 수 있습니다.

<TableBody>
            {summonerPid.map((data: any, idx: number) => (
              <TableRow
                key={idx}
                sx={{ '&:last-child td, &:last-child th': { border: 0 } }}
                className={`rank-${idx + 1}`}
              >
                <TableCell component="th" scope="row" id='w-10'>
                  {champKey ? <img src={`${process.env.PUBLIC_URL}/championImgs/${champKey[data.championId]['img']}`} alt={`${champKey[data.championId]['img']}`} /> : null}
                </TableCell>
                <TableCell align="left" id='fw-700'>{champKey ? champKey[data.championId]['names'] : null}</TableCell>
                <TableCell align="left">{data.championLevel}</TableCell>
                <TableCell align="left">{String(data.championPoints).replace(/(\d)(?=(?:\d{3})+(?!\d))/g, '$1,')}</TableCell>
                <TableCell align="left">{Unix_timestamp(data.lastPlayTime)}</TableCell>
                <TableCell align="left">
                  {data.chestGranted ?
                    <img src={`${process.env.PUBLIC_URL}/box.png`} className='magic-box' /> : <img src={`${process.env.PUBLIC_URL}/emptybox.png`} className='magic-box' />}
                </TableCell>
              </TableRow>
            ))}
          </TableBody>

코드의 일부입니다 저는 react의 public폴더에 저장했기때문에 링크를 저기로 걸었습니다.

이번 포스팅을 마치고 다음 개발로그로 돌아오겠습니다.

profile
화이팅

0개의 댓글