해결된 질문
작성
·
1K
0
개인 프로젝트로 블로그 만들기를 구현하는 중입니다.
모든 프로젝트에 대한 설명은 할 수 없지만, 보안으로 jwt token을 사용하고있고, multipartfile을 통해서 게시글 내에 이미지, 영상, 기타 파일 등을 함께 첨부하여 게시글을 작성할 수 있도록 기능을 구현하였습니다.
파일 업로드 단계까진 잘 되었고, 우선 로컬 저장소를 사용하여 파일은 스프링 부트 프로젝트 내 resources/static/ ~ 이하 이미지:img, 영상:video, 기타 파일:file 로 세부 디렉토리를 나눠서 접근하도록 하였습니다. 우선 사진으로만 테스트 해보는 중인데, 리액트에서 파일을 보여주는 데에 어려움을 겪고있습니다.
export const getImageApi = async (token: string | null, imageName: string) => {
const url = `http://localhost:4000/api/images/${imageName}.jpg`;
try {
const response = await axios.get(url, {
headers: {
Authorization: `Bearer ${token}`,
},
});
const result = response.data;
return result;
} catch (error) {
console.error("Error fetching board data:", error);
return null;
}
};
토큰을 이용해야만 파일에 접근이 가능하기에, 이런식으로 따로 api를 설정하고 접근하는 방식으로 해보려고 하는데 제 생각처럼 잘 되지 않습니다. 해당 api를 통한 요청을 포스트맨으로 조회해보니 이진화 된 파일이 응답으로 나오곤 하는데, 이를 다시 원본으로 복구한 후에 보여줘야하는 것 같은데,, 아직 많이 부족해서 어떤식으로 해야할지 잘 모르겠습니다.
리액트 - 스프링(부트)를 사용하면서 파일 업로드/다운로드(조회)를 할 때, 이런 방식을 사용하는 것이 바람직한 것인지, 단순히 사진을 업로드 하고 조회할 때에 이정도 복잡한 수준으로 구현하는 것이 일반적인 것인지 궁금하고 더 간단하거나 쉽게 할 수 있는 방법이 있다면 알려주시면 감사하겠습니다.
첫 질문이라 소스코드를 많이 올리는 것이 번잡할까 싶어 많이 올려두지 않았습니다. 혹시 도움을 주실 때 관련 소스코드를 필요로 하신다면 보내드리도록 하겠습니다. 감사합니다.
답변 1
0
안녕하세요, 인프런 AI 인턴이에요.
리액트에서 이미지를 보여주기 위해서는 이미지 URL을 사용하여 이미지 요소를 적절히 렌더링해주어야 합니다. 사용자의 코드를 보면 getImageApi
함수에서 이미지 URL을 생성하고 axios를 통해 해당 URL로 GET 요청을 보내는데요. 이 부분에서 어려움을 겪고 계신다고 하셨는데, 어떤 어려움을 겪고 계신지 조금 더 구체적으로 설명해주실 수 있을까요?
여기서 주의해야 할 점은 이미지 URL을 올바르게 생성해야 한다는 것입니다. 예를 들어, http://localhost:4000/api/images/${imageName}.jpg
와 같은 형식으로 URL을 생성하셨는데, ${imageName}
부분을 정확하게 해당 이미지의 파일 이름으로 대체해주어야 합니다. 그리고 해당 URL에 접근하는데에는 토큰이 필요하다고 하셨는데, 토큰을 올바르게 요청 헤더에 담아서 보내주시면 됩니다. 헤더에 Authorization
필드에 Bearer ${token}
형태로 토큰을 담아서 보내주시면 됩니다.
만약 이미지가 정상적으로 요청되지 않는다면, 다음 사항들을 확인해보세요.
1. 이미지 URL이 올바르게 생성되었는지 확인해주세요. ${imageName}
부분이 실제 이미지 파일 이름으로 올바르게 대체되었는지 확인해보세요.
2. 토큰이 올바르게 요청 헤더에 담겼는지 확인해주세요. 토큰이 유효한지, 헤더에 올바르게 추가되었는지 다시 한 번 확인해보세요.
3. 서버 측에서 토큰을 올바르게 인증하고 이미지에 접근할 수 있는지 확인해보세요. 서버 로그나 응답의 상태 코드 등을 확인해보시면 도움이 될 것입니다.
계속해서 어려움을 겪는다면, 더 자세한 정보와 에러 메시지 등을 알려주시면 더 정확한 도움을 드릴 수 있을 것 같아요.