Java (안드로이드) http multipart-form/data 방식을 통한 파일 전송 안드로이드

//URL설정
URL connectURL = new URL("접속할 경로");

//새로운 접속을 연다.
HttpURLConnection conn = (HttpURLConnection)connectURL.openConnection(); 

//읽기와 쓰기 모두 가능하게 설정
conn.setDoInput(true);
conn.setDoOutput(true);

//캐시를 사용하지 않게 설정
conn.setUseCaches(false); 

//POST타입으로 설정
conn.setRequestMethod("POST"); 

//헤더 설정
conn.setRequestProperty("Connection","Keep-Alive"); 
conn.setRequestProperty("Content-Type","multipart/form-data;boundary="+지정한boundary값); 

//Output스트림을 열어
DataOutputStream dos = new DataOutputStream(conn.getOutputStream()); 
dos.writeBytes("--" + 지정한boundary값 + "\r\n"); 
dos.writeBytes("Content-Disposition: form-data; name=\"수신할아이디\";filename=\""+ 실제파일이름 +"\"" + "\r\n"); 
dos.writeBytes("\r\n"); 

//버퍼사이즈를 설정하여 buffer할당
int bytesAvailable = fileInputStream.available(); 
int maxBufferSize = 1024;
int bufferSize = Math.min(bytesAvailable, maxBufferSize); 
byte[] buffer = new byte[bufferSize];
 
//스트림에 작성
int bytesRead = fileInputStream.read(buffer, 0, bufferSize); 
while (bytesRead > 0) 
// Upload file part(s) 
dos.write(buffer, 0, bufferSize); 
bytesAvailable = fileInputStream.available(); 
bufferSize = Math.min(bytesAvailable, maxBufferSize); 
bytesRead = fileInputStream.read(buffer, 0, bufferSize); 
dos.writeBytes("\r\n"); 
dos.writeBytes("--" + 지정한boundary값 + "--" + "\r\n"); 
fileInputStream.close();

//써진 버퍼를 stream에 출력.  
dos.flush(); 

//전송. 결과를 수신.
InputStream is = conn.getInputStream(); 


=================================

지정한boundary값은  말그대로 경계를 나타내는 부분이다. 그냥 a라고 해도 되겠지만

이왕이면 절대 그냥은 나올수 없다고 생각되는 문자들을 사용하는게 좋겠다 

예를 들면 
dkjsei40f9844djs8dviwdf
같은 문자처럼..






덧글

  • 만성피로그래머2 2010/03/22 15:11 # 삭제 답글

    작성하신 블로그 잘 보고 있습니다. ㅋ
    업무시에 도움될 내용도 많은거 같구요 ㅎ

    특히... '만성피로그래머' 이 말이 마음에 와닿네요 ㅋ
  • 남땡 2010/03/22 18:26 #

    네 도움이 되셨다니 기쁘네요^^;
  • parkzel 2010/07/26 19:07 # 삭제 답글

    이와 관련된 ASP.NET page를 어떻게 작성해야 될지 잘 모르겠습니다.

    인터넷을 찾아보면서 작성을 해보았는데...result값으로 .aspx소스 내용이 나오네요.

    그래서 .aspx소스부분을 작성을 안하고 cs page에 page_load부분에 처리를 해주었더니...

    07-26 09:56:46.092: DEBUG/Test(283): file path = /sdcard/rc4.log
    07-26 09:56:46.102: DEBUG/Test(283): mFileInputStream is java.io.FileInputStream@43d39758
    07-26 09:56:46.132: DEBUG/Test(283): DataOutputStream is java.io.DataOutputStream@43d3a450
    07-26 09:56:46.142: DEBUG/Test(283): image byte is 1024
    07-26 09:56:46.161: ERROR/Test(283): File is written
    07-26 09:56:46.412: ERROR/Test(283): result =

    위와 같은 log가 남습니다.

    ASP CS코드부분입니다.
    ========================================================================================
    protected System.Web.UI.HtmlControls.HtmlInputFile File1;
    protected System.Web.UI.HtmlControls.HtmlInputButton Submit1;
    private void Page_Load(object sender, System.EventArgs e)
    {
    // Put user code to initialize the page here
    if( ( File1.PostedFile != null ) && ( File1.PostedFile.ContentLength > 0))
    {
    string fn = System.IO.Path.GetFileName(File1.PostedFile.FileName);
    string SaveLocation = Server.MapPath("files") + "\" + fn;

    try
    {
    File1.PostedFile.SaveAs(SaveLocation);
    Response.Write("The file has been uploaded.");
    }
    catch ( Exception ex )
    {
    Response.Write("Error: " + ex.Message);
    }
    }
    else
    {
    Response.Write("Please select a file to upload.");
    }
    }



  • 남땡 2010/07/27 16:45 #

    ASP는 해본적없고... PHP로 한데다가 소스까지 날려버려서 도움을 드릴수가 없네요....
    힘내세요! ㅠㅠ
  • 톨이 2012/03/16 18:45 # 삭제 답글

    도움이 많이 되었습니다. 감사합니다.

    java server에서는 어떤형태로 받아야하나요?

    multipart로 시도해보았으나 알수없는 Exception으로 답답하네요..

    헤더나 parameter는 정상적으로 넘어오는데, 파일이..ㅠ.ㅠ (참고로 image파일이요)

    혹시 경험이있으시면 조언 부탁드립니다~
  • 나라나라 2012/09/18 00:42 # 삭제 답글

    작성하신 블로그 잘 보고 있습니다. ㅋ
    업무시에 도움될 내용도 많은거 같구요 ㅎ
  • 휘오스 2013/06/21 20:12 # 삭제 답글

    유용한 정보 도움이 많이 됐습니다. 감사합니다.
  • 무풍 2014/01/18 11:39 # 삭제 답글

    소스공개 감사합니다.
    업무에 많은 도움이 되었습니다.
댓글 입력 영역



surprisen85