2013-10-26 1 views
1

Я хочу сделать загрузку файла с многопартийной сущностью. Я хочу загрузить аудиофайл и файл XML. Я хочу установить некоторые заголовки изображения и в часть XML. это как я это делаю:MultipartEntity: не удается установить заголовки для StringBody

// adding the audio file 
      File f = new File(file_path); 

      FileBody body = new FileBody(f); 
      FormBodyPart fbp = new FormBodyPart("file", body); 
      fbp.addField("Content-Disposition", "form-data"); 
      fbp.addField("name", "\"file\""); 
      fbp.addField("filename", "\"" + fileName + "\""); 
      fbp.addField("Content-Type", "audio/mp4"); 
      fbp.addField("Content-Transfer-Encoding", "binary"); 

      entity.addPart(fbp); 

      // adding the XML file 
      String xml= createAudioInfoXML("test", 6, (int) file.length()); 
      StringBody strBody = new StringBody(xml); 
      FormBodyPart fbp2 = new FormBodyPart("file2",strBody); 
      fbp2.addField("Content-Disposition", "form-data"); 
      fbp2.addField("name", "\"file2\""); 
      fbp2.addField("filename", "\"" + fileName + "\""); 
      fbp2.addField("Content-Type", "text/xml"); 
      fbp2.addField("Content-Transfer-Encoding", "binary"); 

      entity.addPart(fbp2); 

я установить те же заголовки, однако, если я проверю запрос POST в Wireshark, я получаю это (Там нет Content-Type заголовка с XML, например, однако я установил он):

POST /upload?recname=2d53352d-c840-48c7-b314-0fc324561ca9 HTTP/1.1 
Content-Type: multipart/form-data; boundary=---------------------------This is the boundary 
Content-Length: 25059 
Host: notes.verba.com 
Connection: Keep-Alive 
User-Agent: Apache-HttpClient/UNAVAILABLE (java 1.4) 

-----------------------------This is the boundary 
Content-Disposition: form-data; name="file"; filename="1382452301277.wav" 
Content-Type: application/octet-stream 

... some data... 

-----------------------------This is the boundary 
Content-Disposition: form-data; name="file2" 

<?xml version="1.0"> 
    <rec> 
     <name>test</name> 
     <length>6</length> 
     <size>24620</size> 
     <date>2013.10.15. 16:42</date> 
    </rec> 
-----------------------------This is the boundary-- 

Вот моя полная функция:

private void upload3(File file) { 

     DefaultHttpClient httpclient = new DefaultHttpClient(); 
     HttpPost httpPost = new HttpPost(url + "?recname=" + guid); 

     String boundary = "---------------------------This is the boundary"; 

     MultipartEntity entity = new MultipartEntity(
       HttpMultipartMode.BROWSER_COMPATIBLE, boundary, null); 

     httpPost.addHeader("Content-Type", "multipart/form-data; boundary=" 
       + boundary); 

     try { 

      // adding the audio file 
      File f = new File(file_path); 

      FileBody body = new FileBody(f); 
      FormBodyPart fbp = new FormBodyPart("file", body); 
      fbp.addField("Content-Disposition", "form-data"); 
      fbp.addField("name", "\"file\""); 
      fbp.addField("filename", "\"" + fileName + "\""); 
      fbp.addField("Content-Type", "audio/mp4"); 
      fbp.addField("Content-Transfer-Encoding", "binary"); 

      entity.addPart(fbp); 

      // adding the XML file 
      String xml= createAudioInfoXML("test", 6, (int) file.length()); 

      //entity.addPart("xml", new StringBody(xml,"application/xml",Charset.forName("UTF-8"))); 

      StringBody strBody = new StringBody(xml); 
      FormBodyPart fbp2 = new FormBodyPart("file2",strBody); 
      fbp2.addField("Content-Disposition", "form-data"); 
      fbp2.addField("name", "\"file2\""); 
      fbp2.addField("filename", "\"" + fileName + "\""); 
      fbp2.addField("Content-Type", "text/xml"); 
      fbp2.addField("Content-Transfer-Encoding", "binary"); 

      entity.addPart(fbp2); 


     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     httpPost.setEntity(entity); 

     try { 

      HttpResponse response = httpclient.execute(httpPost); 

      BufferedReader reader = new BufferedReader(new InputStreamReader(
        response.getEntity().getContent(), "UTF-8")); 
      StringBuilder builder = new StringBuilder(); 

      for (String line = null; (line = reader.readLine()) != null;) { 
       builder.append(line).append("\n"); 
      } 

      reader.close(); 
      message = builder.toString(); 

     } catch (ClientProtocolException e) { 
      e.printStackTrace(); 
      activity.runOnUiThread(new Runnable() { 
       public void run() { 
        Toast.makeText(activity, "Error during the upload.", 
          Toast.LENGTH_LONG).show(); 

       } 
      }); 
     } catch (IOException e) { 
      e.printStackTrace(); 
      activity.runOnUiThread(new Runnable() { 
       public void run() { 
        Toast.makeText(activity, "Error during the upload.", 
          Toast.LENGTH_LONG).show(); 

       } 
      }); 
     } 
    } 

ответ

3

Ибо тот, кто борется с этим, решение было изменить HttpMultipartMode.BROWSER_COMPATIBLE. Поскольку эта строка кода помещает в сообщение Content-Disposition и Content-Type.

Смежные вопросы