带有输入流的httpclient多部分帖子

San*_*dor 4 post android multipart httpclient

我正在为HTTP多部分帖子寻找简单而干净的解决方案,它将发送一些字符串(表单数据)和几个带流媒体支持的文件.(文件需要流式传输以避免内存不足错误)如果可能的话,我想用内置的"org.apache.httpclient"实现这一点.

我能够用HttpURLConnection创建一个干净的解决方案.尽管我对这个解决方案付出了很多努力,但字符串是用8859-x编码而不是UTF-8发送的.

编辑:我的代码在MultiPart和HttpURLConnection源上可用

我用这段代码创建了一个输出流:

HttpURLConnection connection = setupConnection();
dataOutputStream = new DataOutputStream(connection.getOutputStream());
Run Code Online (Sandbox Code Playgroud)

在此之后,我只使用dataOutputStream.writeBytes编写数据

如果我可以从httpclient获得一个输出流,那将是很好的,但它似乎以不同的方式工作.

任何帮助表示赞赏.谢谢

Vit*_*nko 6

我刚刚为此创建了一个简单的解决方案:android_multipart_entity.

它是免费的(包括商业用途),但如果可以,请在我的课程中保留对我的引用.

它旨在与内置的Android一起使用HttpClient.样品使用代码:

HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost("http://www.yourhost.com");
MultipartEntity entity = new MultipartEntity();
entity.addPart(new StringPart("name", "yourname"));
File imageFile = // .. get your image file
entity.addPart(new FilePart("picture", imageFile, null, "image/jpeg"));
httppost.setEntity(entity);
HttpResponse httpResponse = httpclient.execute(httppost);
Run Code Online (Sandbox Code Playgroud)

编辑:

我查看了使用HttpURLConnection代码的MultiPart.由于DataOutputStream使用,您会收到UTF-8问题.API说该课程:

包装现有的OutputStream并将big-endian类型的数据写入其中.通常,此流可以由DataInputStream读入.

这堂课不适合你的需要.为了读取数据,你必须直接相反 - DataInputStream在另一端.

所以我的建议是使用普通的OutputStream.并写入字节.像这样的Smth:

outputStream.write(partSeparator.getBytes());
outputStream.write(("Content-Disposition: form-data; name=\"" + parameter.getKey() + "\"" + lineEnd).getBytes());
outputStream.write(("Content-Type: text/plain; charset=UTF-8" + lineEnd).getBytes());
outputStream.write(("Content-Transfer-Encoding: 8bit" + lineEnd).getBytes());
outputStream.write(lineEnd.getBytes());
outputStream.write(parameter.getValue().getBytes("UTF-8")); // <= this is it!
outputStream.write(lineEnd.getBytes());
outputStream.write(partSeparator.getBytes());
Run Code Online (Sandbox Code Playgroud)