2016-03-30 30 views
4

Bazı form parametrelerini bir HTTP isteğiyle (bir dosyadır) sunucuya göndermem gerekir. Bu yüzdenApache Http İstemcisi 4 Form Gönderi Çok parçalı veri

HttpPost httpPost = new HttpPost(urlStr); 

params = [] 
params.add(new BasicNameValuePair("username", "bond")); 
params.add(new BasicNameValuePair("password", "vesper")); 
params.add(new BasicNameValuePair("file", payload)); 

httpPost.setEntity(new UrlEncodedFormEntity(params)); 
httpPost.setHeader("Content-type", "multipart/form-data"); 

CloseableHttpResponse response = httpclient.execute(httpPost); 

sunucu hata verir ... şöyle Apache HTTP Client kullanın yığın izlemesi ..

the request was rejected because no multipart boundary was found 
at org.apache.commons.fileupload.FileUploadBase$FileItemIteratorImpl.<init>(FileUploadBase.java:954) 
at org.apache.commons.fileupload.FileUploadBase.getItemIterator(FileUploadBase.java:331) 
at org.apache.commons.fileupload.FileUploadBase.parseRequest(FileUploadBase.java:351) 
at org.apache.commons.fileupload.servlet.ServletFileUpload.parseRequest(ServletFileUpload.java:126) 
at org.springframework.web.multipart.commons.CommonsMultipartResolver.parseRequest(CommonsMultipartResolver.java:156) 

Ben nasılsa bir ile gelip gerek diğer yayınlardan anlama

içerikte bulunmayan bir dize olan sınır. Fakat bu sınırı yukarıdaki kodda nasıl oluşturabilirim? Başka bir parametre mi olmalı? Sadece bir kod örneği ihtiyacım olan şey.

cevap

1

content-type varsayılan Doğru yol, ama tam değildi. Sonunda işe almak için ne yaptım işte ...

File payload = new File("/Users/CasinoRoyaleBank") 
MultipartEntity entity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE); 
entity.addPart("file", new FileBody(payload)) 
entity.addPart("username", new StringBody("bond")) 
entity.addPart("password", new StringBody("vesper")) 
httpPost.setEntity(entity); 
CloseableHttpResponse response = httpclient.execute(httpPost); 
+0

Tamam, anlıyorum. Bunun için üzgünüm, ama cevabı kabul ettiğinizde bunun sizin için çalıştığını varsaydım. Cevabımı bulgularınızla güncelleyeceğim. – gustf

+0

Tekrar Merhaba, yanıtı oluşturucuyu kullanan eşdeğer bir kodla güncelledim. Ayrıca orijinal koddaki farklılıkları da kontrol ettim: 1) Diğer parçalardan önce addPart ("dosya", yeni FileBody (yük)) "2)" charset ", kodunuzdaki kullanımdan kaldırılan kurucuda 'ASCII' olarak ayarlandı . Ve orijinalimde "ISO_8859_1" varsayılanı var. Bu normalde herhangi bir sorun olmamalıdır, bu yüzden benim fikrim, aynı zamanda garip olan ilk şey olmasıdır. Ama belki de bu 'MultipartHttpServletRequest' çalışmasının yolu, bilmiyorum. Bunu test etmek için ilgi ve zamanınız varsa, bu harika olurdu. – gustf

8

Kural dışı durumun belirttiği gibi, "çok parçalı sınır" belirtmediniz. Bu, istekte farklı bölümler arasında bir ayırıcı olarak işlev gören bir dizedir. Ama sizde, farklı bölümleri kullanmamanız gibi görünüyor.

Muhtemelen kullanmak istediğiniz, MultipartEntityBuilder olduğundan, kapağın altında nasıl çalıştığı konusunda endişelenmenize gerek yoktur.

Aşağıdaki

 HttpPost httpPost = new HttpPost(urlStr); 

     File payload = new File("/Users/CasinoRoyaleBank"); 

     HttpEntity entity = MultipartEntityBuilder.create() 
       .setMode(HttpMultipartMode.BROWSER_COMPATIBLE) 
       .addBinaryBody("file", payload) 
       .addTextBody("username", "bond") 
       .addTextBody("password", "vesper") 
       .build(); 
     httpPost.setEntity(entity); 

yapmak Tamam olmalıdır Ancak, aşağıda ama kaldırılmış yöntemler/yapıcıları kullanılmadan @AbuMariam bulguları ile uyumlu olması gereken bir sürümüdür.

 File payload = new File("/Users/CasinoRoyaleBank"); 

     ContentType plainAsciiContentType = ContentType.create("text/plain", Consts.ASCII); 
     HttpEntity entity = MultipartEntityBuilder.create() 
       .setMode(HttpMultipartMode.BROWSER_COMPATIBLE) 
       .addPart("file", new FileBody(payload)) 
       .addPart("username", new StringBody("bond", plainAsciiContentType)) 
       .addPart("password", new StringBody("vesper", plainAsciiContentType)) 
       .build(); 
     httpPost.setEntity(entity); 

     CloseableHttpResponse response = httpclient.execute(httpPost); 

UrlEncodedFormEntity normalde çok parçalı için kullanılır ve değil onu ben yiyordum istisna kurtuldum çünkü gustf cevabını kabul etti ve bu yüzden ben sanıyordum application/x-www-form-urlencoded

+0

Öneriniz artık hata almamıştım. Ama o tarafta, bu veriyi okurken, ben yapıyorum .. MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest) isteği; CommonsMultipartFile file = (CommonsMultipartFile) multiRequest.getFile ("dosya"); Ve dosya boş olarak çıkıyor. – AbuMariam

+0

Yanıtı builder.addBinaryBody (String, File) 'ile ilgili olarak güncellendi. Ama sanırım bunu zaten görmüştünüz :) – gustf

+1

Bunun neden daha fazla borcu olmadığını bilmiyorum, 2 saatlik karmaşık çözümler aradıktan sonra, bu basit ve cazibeye benziyor. Bu konu için en iyi cevap stackoverflow. –