【问题标题】:httpclient multipart post with input streaming带有输入流的 httpclient 多部分帖子
【发布时间】:2011-11-17 20:34:27
【问题描述】:

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

我能够使用 HttpURLConnection 创建一个干净的解决方案。 尽管我在这个解决方案上做了所有努力,但字符串是使用 8859-x 编码而不是 UTF-8 发送的。

编辑:我的代码可在MultiPart with HttpURLConnection source获得

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

HttpURLConnection connection = setupConnection();
dataOutputStream = new DataOutputStream(connection.getOutputStream());

在这之后我只是用 dataOutputStream.writeBytes 写了数据

如果我可以从 httpclient 获得输出流,那就太好了,但它似乎以不同的方式工作。

感谢任何帮助。 谢谢

【问题讨论】:

  • 抱歉,您的代码在您的 URL 中不再可用。可以在这里转发吗?

标签: android post httpclient multipart


【解决方案1】:

我刚刚为此创建了一个简单的解决方案: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);

编辑:

我使用 HttpURLConnection 代码查看了您的 MultiPart。由于 DataOutputStream 的使用,您会遇到 UTF-8 问题。 API 对那个类说:

包装现有的 OutputStream 并向其写入 big-endian 类型的数据。通常,此流可以被 DataInputStream 读入

这个课程不适合你的需要。为了读取数据,您必须在另一端直接使用 DataInputStream

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

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());

【讨论】:

  • 嗯,我成功使用了这个。究竟出了什么问题?您在 LogCat 中遇到什么错误?会不会是服务器问题?您是否在 android 清单中指定互联网权限?
  • 可能是服务器问题。我可以使用依赖 HTTPURLConnection 的类发布文件。我在那里手动编写了多部分通信。服务器需要在文件二进制数据前换行,不知道是不是标准。服务器是一个php服务器。我必须尽快解决这个问题。我会深入研究代码。
  • 回答你的问题,完全没有错误,只是文件没有到达服务器
  • @Sandor:抱歉,我没抓住你——你有没有试过我的解决方案?听起来不像。我成功地将我的解决方案与 php 和 ruby​​ 服务器一起使用,所以我可以保证它可以正常工作。
  • 这个代码Arhimed的大起大落,据我所知,它就像一个魅力!在将大文件从 SD 卡流式传输到正文中带有字符串的服务器方面也有巨大帮助,并且不会导致 OOM 错误!再次感谢
猜你喜欢
  • 2011-01-19
  • 2014-11-02
  • 2018-08-05
  • 2013-07-19
  • 1970-01-01
  • 2015-09-08
  • 2018-04-15
  • 1970-01-01
  • 2019-05-06
相关资源
最近更新 更多