отправить параметры при загрузке файла - PullRequest
0 голосов
/ 04 апреля 2011

У меня есть этот кусок кода http://pastebin.com/VrMNuxcv, который успешно загружает файл на сервер с моего андроида.

Я должен отправить пару строковых параметров вместе с ним.

Для этого я дал

 conn.setRequestProperty("x-myapp-param1", "Parameter 1 text"); 

На стороне сервера (метод Servlet DoPsot)

Я попытался получить строковый параметр с помощью

String userId = request.getParameter("myapp-param1");

Но

 userId is null

Мой код в клиентской части приведен ниже:

    URL url = new URL(upLoadServerUri);
            conn = (HttpURLConnection) url.openConnection(); // Open a HTTP
                                     // connection to
                                     // the URL
            conn.setDoInput(true); // Allow Inputs
            conn.setDoOutput(true); // Allow Outputs
            conn.setUseCaches(false); // Don't use a Cached Copy
            conn.setRequestMethod("POST");
            conn.setRequestProperty("Connection", "Keep-Alive");
                conn.setRequestProperty("ENCTYPE", "multipart/form-data");
            conn.setRequestProperty("Content-Type",
                "multipart/form-data;boundary=" + boundary);
            conn.setRequestProperty("file_name", fileName);
            conn.setRequestProperty("x-myapp-param1", "Parameter 1 text"); 
           dos = new DataOutputStream(conn.getOutputStream());
            dos.writeBytes(twoHyphens + boundary + lineEnd);

            dos.writeBytes("Content-Disposition: form-data; name=\"file_name\";filename=\""
                + fileName + "\"" + lineEnd);

                dos.writeBytes(lineEnd);

            bytesAvailable = fileInputStream.available

(); 

Код сервера:

response.setContentType("text/html");
        PrintWriter out = response.getWriter();    

        String userId = request.getParameter("myapp-param1");
        String x_user_id = request.getParameter("x-myapp-param1");
        System.out.println("userId getParameter  : "+userId +"x_user_id  :  "+ x_user_id);
        System.out.println("request.getHeaderNames();"+request.getHeaderNames());
        System.out.println("request.getHeaderNames();"+request.getHeaders("x"));


        File filenameImg = null;
        List<FileItem> items = null;
        try {
            items = new ServletFileUpload(new DiskFileItemFactory())
                    .parseRequest(request);
        } catch (FileUploadException e) {
            throw new ServletException("Cannot parse multipart request.", e);
        }

        for (FileItem item : items) {



            if (item.isFormField()) {



                // Process regular form fields here the same way as
                // request.getParameter().
                // You can get parameter name by

                String fieldname = item.getFieldName();       
                String fieldvalue = item.getString(); 
                System.out.println("user_id===fieldname======: "+fieldname);
                //System.out.println("user_id====fieldvalue=====: "+fieldvalue);
                // You can get parameter value by item.getString();
            } else {

                try{
                    // Process uploaded fields here.
                    String filename = FilenameUtils.getName(item.getName());
                    // Get filename.
                    String path = GetWebApplicationPathServlet.getContext().getRealPath("/images");

                    File file =  new File(path,filename);


                    // Define destination file.

                    item.write(file);
                    System.out.println("filename: "+filename);
                    System.out.println("file: "+file);
                    request.setAttribute("image", file);
                    filenameImg = file;
                    // Write to destination file.
                //  request.setAttribute("image", filename);
                }
                catch (Exception e) {
                    e.printStackTrace();
                }

            }
        }

Ответы [ 3 ]

4 голосов
/ 04 апреля 2011

Есть две основные проблемы:

  1. URLConnection#setRequestProperty() устанавливает HTTP-запрос заголовок , а не HTTP-запрос параметр .Это две совершенно разные вещи.В случае multipart/form-data запросов вы должны написать их как полноценную составную часть.Вы можете найти подробный пример в этот ответ (см. Раздел Загрузка файлов в нижней части).

  2. В случае HTTP multipart/form-data запрос, параметры недоступны HttpServletRequest#getParameter().Вы должны рассматривать их как составные части , а не как параметры запроса.Вы можете проанализировать их с помощью Apache Commons FileUpload или, если вы уже используете Servlet 3.0, с помощью HttpServletRequest#getParts().Вы уже используете Apache Commons FileUpload, так что просто сохраните эту часть и избавьтесь от ненужных вызовов getParameter().Обычные параметры доступны в разделе, прокомментированном как «Обрабатывать здесь обычные поля формы».

1 голос
/ 04 апреля 2011

Я понял, что моя Fileupload добавила библиотеки appace-mime, они поддерживают сущности.

MultipartEntity entity = new MultipartEntity(HttpMultipartMode.STRICT); 

            for(int index=0; index < nameValuePairs.size(); index++) { 
                ContentBody cb;
                if(nameValuePairs.get(index).getName().equalsIgnoreCase("File")) { 
                    File file = new File(nameValuePairs.get(index).getValue());
                    FileBody isb = new FileBody(file,"application/*");

                    /*
                    byte[] data = new byte[(int) file.length()];
                    FileInputStream fis = new FileInputStream(file);
                    fis.read(data);
                    fis.close();

                    ByteArrayBody bab = new ByteArrayBody(data,"application/*","File");
                    entity.addPart(nameValuePairs.get(index).getName(), bab);
                    */  
                    entity.addPart(nameValuePairs.get(index).getName(), isb);
                } else { 
                    // Normal string data 
                    cb =  new StringBody(nameValuePairs.get(index).getValue(),"", null);
                    entity.addPart(nameValuePairs.get(index).getName(),cb); 
                } 
            } 


            httpost.setEntity(entity);
1 голос
/ 04 апреля 2011

Проверьте орфографию

Вы делаете

conn.setRequestProperty("x-myapp-param1", "Parameter 1 text"); 

и

String userId = request.getParameter("myapp-param1");

Обратите внимание на отсутствующий x- на стороне получателя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...