【问题标题】:HTTP file upload without actually using a file不实际使用文件的 HTTP 文件上传
【发布时间】:2012-02-28 09:14:19
【问题描述】:

我正在使用 Apache HttpComponents'HttpClient 将文件上传到第三方 Web 界面。代码如下所示:

HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost("UPLOAD_URL");
FileBody bin = new FileBody(file, filename, "text/csv", "UTF-8");
MultipartEntity reqEntity = new MultipartEntity();
reqEntity.addPart("Username", new StringBody("User"));
reqEntity.addPart("Password", new StringBody("Password"));
reqEntity.addPart("bin", bin);
httppost.setEntity(reqEntity);
HttpResponse response = httpclient.execute(httppost);

这是按预期工作的。

由于这些数据很敏感,我不希望它存储在客户端。 (程序从网络服务中检索这些数据。我创建文件只是为了上传它。)

所以我正在寻找一种不使用真实文件的方法,而是将其替换为某种内存中的表示形式。我尝试改用InputStreamBody,但这些请求被第三方系统拒绝。

有什么想法可以做到这一点吗?

【问题讨论】:

  • 因此,作为客户端,您的应用程序从 Web 服务获取文件并将其上传到您的服务器,就像代理一样......但您不希望您的应用程序有权访问所说的文件?我想说你在这里问错了问题,因为无论你将它存储在哪里——内存或文件——客户端都可以访问它......
  • 是的,但这可能仍然是一个有效的要求 - 如果您信任用户但不希望敏感的个人数据存在磁盘上。
  • 我们的网络服务返回文件,该文件由客户端应用程序创建,仅用于上传。客户端应用程序可以访问此数据,但我不希望将其作为文件存储在客户端计算机上。数据在上传后立即被客户端删除,但在某些情况下可能会失败。在这种情况下,数据将保留在客户端计算机上供任何人访问。

标签: java http file-upload


【解决方案1】:

看起来使用InputStreamBody的问题是getContentLength方法,看起来像这样:

public long getContentLength() {
    return -1;
}

这会导致 chunked HTTP POST (Transfer-Encoding: chunked),该特定 Web 界面似乎无法理解。所以,我最终像这样扩展InputStreamBody

public class NoFileBody extends InputStreamBody {

  private final long length;

  public NoFileBody(final InputStream in, final String mimeType, final String filename, final long length) {
    super(in, mimeType, filename);
    this.length = length;
  }

  @Override
  public long getContentLength() {
    return length;
  }

}

【讨论】:

  • 你能展示一下如何将它与BufferedImage一起使用吗?
【解决方案2】:

看看 MultipartEntity:addPart 方法接受一个 String 和一个 ContentBody 作为参数。 ContentBody 似乎是一个易于实现的接口(FileBody 实现了它)。您基本上必须编写 writeTo(OutputStream) 方法,才能将数据输出到 OutputStream。

【讨论】:

  • Thats why I tried InputStreamBody`,没有任何运气。现在将尝试自定义实现。
  • 如果我是你,我会基于 FileBody,它不到 150 行代码(包括 cmets)!我已经编辑了帖子以显示如何
  • 你不能这样做:writeTo 是在接口ContentBody 中定义的一个方法,所以你不能只改变它的签名。
猜你喜欢
  • 2023-03-04
  • 1970-01-01
  • 1970-01-01
  • 2013-01-13
  • 1970-01-01
  • 1970-01-01
  • 2011-02-20
  • 1970-01-01
  • 2011-01-11
相关资源
最近更新 更多