티스토리 뷰
이미지 파일을 반환하는 API를 구현하면서 에러가 발생했을 때에는 json 데이터를 반환하도록 했다.
그런데 성공 시에도 json 데이터로 파일을 반환할 수 없는지 알아보다가 파일 데이터를 String으로 반환할 수 있다는 것을 발견하고 테스트 해 보았다.
java에서 파일 데이터를 반환하고 C#에서 파일을 받아 로컬에 저장하는 소스이다.
1) java에서 파일 데이터 반환 : 아래 encodedImage의 값을 json 객체에 담아 반환한다.
String encodedImage = ""; //파일데이터를 담을 String
InputStream inputStream = null;
try{
inputStream = 삼바파일(SmbFile Object).getInputStream();
//File Object인 경우
//FileInputStream inputStream = new FileInputStream(File Object);
byte[] bytes = IOUtils.toByteArray(inputStream);
encodedImage = Base64.encodeBase64String(bytes); //Base64로 인코딩
}catch(Exception e){
e.printStackTrace();
//에러메시지 작성
}finally{
if(inputStream != null){
try{
inputStream.close();
}catch(Exception err){
inputStream = null;
}
}
}
2) C#에서 string을 Image로 변환하여 로컬에 저장 : java에서 전달받은 encodedImage를 Image로 변환한다.
public void stringToImage(string encodedIamge)
{
byte[] imageBytes = Convert.FromBase64String(encodedImage); //Base64디코딩
MemoryStream ms = new MemoryStream(imageBytes);
System.Drawing.Image image = System.Drawing.Image.FromStream(ms); //Image Object로 변환
image.Save(로컬저장경로); //로컬에 저장
}
3) 위 코드를 실행했을 때 입력에 Base-64가 아닌 문자 또는 세 개 이상의 패딩 문자가 있거나 패딩 문자 사이에 잘못된 문자가 있기 때문에 입력이 유효한 Base-64 문자열이 아닙니다. 라는 에러가 발생한다.
이 에러에 관련하여 참고한 사이트는 다음과 같다.
https://stackoverrun.com/ko/q/4097774
https://stackoverflow.com/questions/44773785/why-base64-encodetostring-split-with-r-n
나의 경우는 위의 에러와 달랐는데, 위의 내용들을 참고하여 java에서 보낸 문자열과 C#에서 받은 문자열의 차이점을 비교하였다. java에서 보낸 문자열을 하드코딩하여 string 변수를 만들어 사용하면 에러없이 메소드가 실행되었다.
그러나 C#에서 받은 문자열을 그대로 사용하면 에러가 발생하였다. 문자열을 비교하던 중, C#에서 받은 문자열에 캐리지 리턴 문자(\r\n)가 담겨있는 것을 발견했다.
그래서 Base64 디코딩 전에 encodedImage = encodedImage.Replace("\\r\\n", ""); 코드를 추가하여 처리해 주었더니 에러없이 이미지가 저장되었다.
4) 기타 참고한 사이트
https://okky.kr/article/243786
https://stackoverflow.com/questions/30818538/converting-json-object-with-bitmaps/30824334#30824334
https://stackoverflow.com/questions/1264709/convert-inputstream-to-byte-array-in-java
https://stackoverflow.com/questions/17348042/converting-from-string-to-image-in-c-sharp
https://pooheaven81.tistory.com/41
https://www.codeproject.com/Articles/15460/C-Image-to-Byte-Array-and-Byte-Array-to-Image-Conv
https://sdw8001.tistory.com/24
https://stackoverflow.com/questions/30398147/how-to-write-image-in-img-tag-in-c-sharp
https://stackoverflow.com/questions/7178937/java-bufferedimage-to-png-format-base64-string
https://micropilot.tistory.com/2597
https://stackoverflow.com/questions/13926513/decode-java-encoded-base64-string-in-c-sharp