안녕하십니까?
스프링으로 OCR 기능을 구현중 이미지파일 바이너리 관련 질문이 있어 올립니다.
이미지 파일을 등록하면, 서버에 저장하고, 서버에 저장된 파일을 가져와 바이너리스트링으로 변환하여
image 파라미터에 값으로 붙여서 보내는 소스를 작성했습니다.
결과는 400 에러가 납니다 …
이미지를 바이너리로 전송하라는 게 어떤 의미인지 참 어렵네요
예제코드가 혹시 있을까요 …?
아니면 어디가 잘못되었는지 알려주실 수 있을까요?
import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import org.apache.commons.codec.binary.Base64;
import org.springframework.stereotype.Repository;
import org.springframework.web.multipart.MultipartFile;
import com.konan.rest.upload.model.vo.FileVo;
import com.konan.rest.upload.model.vo.KakaoConfig;
@Repository(“ocrDao”)
public class OcrDao {
public String requestOcr(MultipartFile file, KakaoConfig kc, FileVo fv) {
try {
// url 객체 생성(
URL url = new URL(kc.getKakaoURI()+kc.getKakaoMethod());
System.out.println("요청 url : " + url);
// https://dapi.kakao.com/v2/vision/text/ocr
// Https 를 사용하는 url 연결 객체 생성
HttpURLConnection conn = null;
// url 헤더랑 바디에 이것저것 담을 수 있게 반환
conn = (HttpURLConnection) url.openConnection();
// inputStream 으로 응답헤더와 메시지를 읽어들이겠다는 옵션
conn.setDoInput(true);
// OutputStream 으로 POST 데이터를 넘겨주겠다는 옵션
conn.setDoOutput(true);
conn.setUseCaches(false);
conn.setRequestMethod("POST");
// 요청 헤더 정의
conn.setRequestProperty("Authorization", "KakaoAK " + kc.getRestApiKey());
conn.setRequestProperty("Content-Type", "multipart/form-data");
//System.out.println("Authorization : " + kc.getRestApiKey());
// KakaoAK 11111111111111111111111111111111 ... 뭐 대략 이렇게 나옴
/*
* 일단 파일이나 불러와보자
*/
// 여기서부터 commons-codec 사용
String binaryOut = new String();
FileInputStream fis = null;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
try {
fis = new FileInputStream(new File(fv.getSaveFullPath()));
} catch (FileNotFoundException e) {
System.out.println("몰라 에러야");
}
int len = 0;
byte[] buf = new byte[1024];
while((len = fis.read(buf)) != -1) {
baos.write(buf, 0, len);
}
byte[] fileArray = baos.toByteArray();
System.out.println("fileArray.length : " + fileArray.length);
binaryOut = new String(Base64.encodeBase64(fileArray));
//System.out.println("binaryOut : " + binaryOut);
//DataInputStream dis = new DataInputStream(new ByteArrayInputStream(fileArray));
//long resultValue = dis.readLong();
/*
* 위 작업이 바이너리 스트링으로 만든게 맞다면,
* 저걸 담아서 보내줘야 함... 하드코딩으로 해보자 일단
*/
//String urlParameters = "image="+str;
String urlParameters = "image=" + binaryOut;
DataOutputStream wr = new DataOutputStream(conn.getOutputStream());
wr.write(urlParameters.getBytes("UTF-8"));
wr.flush();
wr.close();
/*
// 쓰기 객체 열기. RequestBody에 Data를 담기 위해 OutputStream 객체를 생성
OutputStream os = conn.getOutputStream();
// 문자열을 utf-8 방식으로 변환해서 바이트로 입력.RequestBody에 Data 셋팅
os.write(urlParameters.getBytes("utf-8"));
// Request Body에 Data 입력
os.flush();
os.close();
*/
/*
* 위에서 잘 보냈으면, 결과값도 담고 있겠지
*/
// 실제 서버로 Request 요청하는 부분
int responseCode = conn.getResponseCode();
String responseMsg = conn.getResponseMessage();
System.out.println("응답코드 : " + responseCode);
System.out.println("응답메시지 : " + responseMsg);
conn.disconnect();
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
}