2010-06-10 19 views
0

Je suis en train de développer un client Http qui télécharge un fichier avec HttpComponents:question ContentType avec commons-upload et httpcomponent client

HttpPost httppost = new HttpPost(myURL); 
httppost.setHeader("Content-type", 
     "multipart/form-data; boundary=stackoverflow"); 
httppost.setHeader("Accept", "text/xml"); 
MultipartEntity reqEntity = new multipartEntity(
     HttpMultipartMode.BROWSER_COMPATIBLE,"stackoverflow", 
     Charset.forName("UTF-8")); 
FileBody bin = new FileBody(myFile); 
reqEntity.addPart("File", bin); 
httppost.setEntity(reqEntity); 
HttpResponse response = client.execute(httppost); 

côté serveur, il existe une méthode

doPost(HttpServletRequest request, HttpServletResponse response) 

qui analyser la requête:

FileItemFactory factory = new DiskFileItemFactory(204800, new File(
        uploadDirectory)); 
ServletFileUpload fileUpload = new ServletFileUpload(factory); 
try { 
    List<FileItem> items = fileUpload.parseRequest(request); 
    Iterator<FileItem> itemIterator = items.iterator(); 
    while (itemIterator.hasNext()) { 
      FileItem item = itemIterator.next(); 
      .... 

Cela fonctionne très bien, mais le problème est que le type de contenu de mon FileItem i s null et j'ai une NullPointerException plus tard. Cependant, quand je fais bin.getContentType() du côté client, je reçois "text/xml".

Est-ce que quelqu'un sait quand ce type de contenu est perdu et comment résoudre ce problème?

Répondre

2

Vous utilisez le mauvais mode. En mode BROWSER_COMPATIBLE, le type de contenu n'est pas envoyé au serveur. Vous devez utiliser le mode STRICT pour envoyer content_type. Cependant, STRICT peut ne pas fonctionner pour vous parce que certains serveurs Web ne l'aiment pas.

Le type de contenu par défaut pour FileBody est application/octet-stream. Vous pouvez le changer comme ceci,

FileBody bin = new FileBody(new File(myFile), "text/html"); 
+0

Cela fonctionne parfaitement. Merci beaucoup! – user299957