마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

안드로이드 jsp서버 이미지 업로드 에러

0 추천

multipart를 이용해서 서버에 이미지를 저장하는 예제를 하던 중 다음에러가 났습니다. "java.io.IOException: Posted content type isn't multipart/form-data"

검색으로  enctype="multipart/form-data"를 입렵하라고 해서 했는데도 안되네요...

<FORM action="http://server.com/cgi/handle"
       enctype="multipart/form-data"
       method="post">
</FORM>

고수님들 부탁드립니다 ~ 밑에는 제가 작성한 소스입니다.

[ 안드로이드 ]

import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.mime.HttpMultipartMode;
import org.apache.http.entity.mime.MultipartEntity;
import org.apache.http.entity.mime.content.FileBody;
import org.apache.http.impl.client.DefaultHttpClient;

import java.io.File;

public class MainActivity extends AppCompatActivity {

    Button imgsendbtn;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        final String sdcard = Environment.getExternalStorageDirectory().getPath();

        imgsendbtn = (Button)findViewById(R.id.imgSendBtn);
        imgsendbtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                try {
                    HttpClient client = new DefaultHttpClient();
                    String url = "http://ec2-**-**-**-**.ap-northeast-2.compute.amazonaws.com:8080/jykim/imgupload.jsp";

                    HttpPost post = new HttpPost(url);

                    File glee = new File(sdcard+"/aroma.png");
                    FileBody bin = new FileBody(glee);

                    MultipartEntity multipart = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);
                    multipart.addPart("images", bin);

                    post.setEntity(multipart);
                    client.execute(post);
                } catch (Exception e){}

            }
        });
    }
}

[ jsp 서버 ]

<FORM action="http://server.com/cgi/handle"
       enctype="multipart/form-data"
       method="post">
  </FORM>

<%@ page language="java" contentType="text/html; charset=utf-8"
        pageEncoding="utf-8"%>
<%@ page
        import="com.oreilly.servlet.MultipartRequest"
        import="com.oreilly.servlet.multipart.DefaultFileRenamePolicy"
        import="java.util.*"
        import="java.io.*"%>

<%
        String savePath = getServletContext().getRealPath("/imgupload/");
        int sizeLimit = 5 * 1024 * 1024;
        try {
                MultipartRequest multi = null;
                multi = new MultipartRequest(request,savePath,
                sizeLimit, new DefaultFileRenamePolicy());
/*                      Enumeration formNames = multi.getFileNames();
                        String formName = (String) formNames.nextElement();
                        String fileName = multi.getFilesystemName(formName);
                        multi.getFile("images");*/
                } catch (Exception e) {
                        out.println(e);
                        out.print("예외 상황 발생..! ");
                }

%>

 

 

zangon (810 포인트) 님이 2016년 2월 18일 질문
zangon님이 2016년 2월 18일 수정

1개의 답변

0 추천

일단 기본적인 http 의 개념을 파악하시는 편이 나아보입니다. 

 

업로드를 위해서는 먼저 client 단에

<form> <inpu type='file' /> <input type='submit' /> </form> 형태가 필요하고 사용자는 input type 이 file 인 객체를 통해 업로드할 파일을 선택하게 됩니다. 이부분은 인터넷에서 사진을 올려봤을 테니 아실 거구요

사용자가 첨부할 파일을 선택한 이후 해당 파일을 전송하겠다는 시도로 input type submit 을 선택하게 되면

http  통신을 하게 됩니다. 이때 전송 형태가 multipart 형태이면 body 에서 전달할 plain text 와 binary 를 지정한 boundary 를 통해 구분해서 전달하게됩니다. (세부사항은 RFC1341 을 찾아보시구요)

서버에서는 client 가 전달한 데이터 중 HTTP 헤더에서 현재의 형태가 mulitpart 인지를 파악하고 boundary 가 어떻게 구성되어 있는지도 파악한 뒤에 전달된 Http body 데이터를 읽어서 파일을 저장하게 되는데 

현재의 문제점은 

<FORM action="http://server.com/cgi/handle"
       enctype="multipart/form-data"
       method="post">
  </FORM>

로만 되어 있고 form 안에 어떤 데이터를 전달할 것인가에 대한 내용이 없으니 서버는 받을 내용이 없는 것 입니다. 

처음부터 뛰지말고, HTTP 스팩을 확인해보면서 왜 이렇게 해야되나를 고민해보세요 

aucd29 (218,390 포인트) 님이 2016년 2월 18일 답변
답변 감사드립니다. 처음부터 다시 공부해봐야겟네요..
...