2012년 1월 30일 월요일

Mobile Device에서 HTTP Post를 이용한 파일 첨부


Mobile Device에서 Server Side로 첨부 파일을 보내는 방법을 생각해 봤습니다.
  1. File을 Base64 Encoding 하여 Parameter로 Server에 전달 Server는 Base64 Decoding 하여 사용.
  2. Server Side API에 SOAP Message Attachments을 사용.
  3. Server Side API에 Axis의 DataHandler을 사용하는 방법.
  4. HTTP Body에 Binary Data을 넣어서 보내는 방법.


1.번은 File 크기가 크다면 문제가 될 것이고, 2,3번은 별도의 Client Stub을 생성하여 가지고 있어야 하니 번거롭고, 4번이 가장 적당할 것 같습니다.

간단하게 전송 규약을 정해봤습니다.

  • HTTP Method: Post
  • contentType: multipart/formed-data
  • contentLength: 첨부되는 파일의 크기
  • “FILE_NAME”의 Custom header을 사용하여 파일 명 전달.


Server Side Code

String contentType = request.getContentType();
int contentLength = request.getContentLength();
String fileName = request.getHeader("FILE_NAME");
File f = recvFile(request.getInputStream(), contentLength, fileName);

private File recvFile(InputStream in, int length, String fileName)
throws IOException {
   if (fileName == null || fileName.length() == 0 || length <= 0)
       return null;

BufferedInputStream bis = null;
BufferedOutputStream bos = null;
try {
bis = new BufferedInputStream(in);
bos = new BufferedOutputStream(new FileOutputStream("C:/"+fileName));

int c;
while ((c = bis.read()) != -1) {
bos.write(c);
}
bos.flush();
}
catch (Exception e) {
e.printStackTrace();
return null;
}
finally {
try {
if (bis != null)
bis.close();
}
catch (Exception ex) {}
try {
if (bos != null)
bos.close();
}
catch (Exception ex) {}
}

   return new File(fileName);
}


Client Side Code
File addFile = new File(filePath);
HttpParams params = new BasicHttpParams();

HttpConnectionParams.setConnectionTimeout(params, 30000);
HttpConnectionParams.setSoTimeout(params, 30000);
HttpConnectionParams.setTcpNoDelay(params, true);

// Server Side URL
String addPicURL = url+getString(R.string.default_value_picAdd);
HttpPost post = new HttpPost(addPicURL);
post.addHeader("FILE_NAME", "첨부되는 파일 이름");
FileEntity entity = new FileEntity(addFile, "multipart/formed-data");
post.setEntity(entity);
DefaultHttpClient client = new DefaultHttpClient(params);

HttpResponse response = client.execute(post);

int statusCode = response.getStatusLine().getStatusCode();
if(statusCode == 200) {
// Etc Code
} else {
Log.d(this.getClass().getSimpleName(), "StatusCode: "+statusCode);
}


이미지 파일이 전송되는 경우라면 Mobile Device(iOS, Android)에서 이미지를 적당히 줄여서 보낼수 있습니다. Mobile Device에서 촬영한 사진은 1~2M 정도지만 적당히 줄이면 200kb 정도로 전송할 수 있습니다.

댓글 없음:

댓글 쓰기

블록체인 개요 및 오픈소스 동향

블록체인(block chain) 블록체인은 공공 거래장부이며 가상 화폐로 거래할때 발생할때 발생할 수 있는 해킹을 막는 기술. 분산 데이터베이스의 한 형태로, 지속적으로 성장하는 데이터 기록 리스트로서 분산 노드의 운영자에 의한 임의 조작이 불가...