【问题标题】:Java - Upload OutputStream as HTTP File UploadJava - 将 OutputStream 上传为 HTTP 文件上传
【发布时间】:2012-09-27 14:18:09
【问题描述】:

我有一个写入OutputStream 的旧应用程序,我希望将此流的内容作为文件上传到 Servlet。我已经使用 JMeter 测试了使用 commons-fileupload 的 Servlet,它工作得很好。

我会使用 Apache HttpClient,但它需要 File 而不仅仅是输出流。我不能在本地写文件;如果有一些File 的内存实现可能会起作用?

我尝试使用HttpURLConnection(如下),但服务器响应“MalformedStreamException:流意外结束”。

        URL url = new URL("http", "localhost", 8080, "/upload");
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        connection.setDoOutput(true);
        String boundary = "---------------------------7d226f700d0";
        connection.setRequestProperty("Content-Disposition", "form-data; name=\"file\""); 
        connection.setRequestProperty("Content-Type", "multipart/form-data; boundary="+boundary);
        connection.setRequestProperty("Accept", "application/json");
        connection.setRequestMethod("POST");   
        connection.setChunkedStreamingMode(0);
        connection.connect();           

        OutputStream out = connection.getOutputStream();
        byte[] boundaryBytes =("--" + boundary + "\r\n").getBytes();
        out.write(boundaryBytes);


        //App writes to outputstream here

        out.write("\r\n".getBytes());
        out.write(("--"+boundary+"--").getBytes());
        out.write("\r\n".getBytes());

        out.flush();
        out.close();
        connection.disconnect();

【问题讨论】:

  • 根据定义,File 没有内存实现。但是,您可以复制 HttpClient 方法并直接传递字节或流,因为该 API 很可能通过流加载文件的字节。

标签: java upload httpurlconnection multipartform-data apache-commons-httpclient


【解决方案1】:

PostMethod 允许您设置一个RequestEntity,这是一个 可以实现的接口。您只需要适当地实现RequestEntity.writeRequest 方法即可。

或者,如果您希望 HttpClient 为您处理多部分内容,您可以将 MultipartRequestEntity 与自定义部分一起使用。

【讨论】:

  • 优秀 - 看起来我什至可以实现 PartSource。旧版应用程序将OutputStream 作为参数,然后写入它,所以我可以控制OutputStream 里面的内容。我猜我可以使用ByteArrayOutputStream,让遗留代码写入它,生成字节数组,然后实现一个PartSource,它接受一个字节数组而不是一个文件,然后提供一个ByteArrayInputStream from那个?
  • @Deejay - 你可以这样做,但如果你有大流,它就不会很好地扩展。
猜你喜欢
  • 1970-01-01
  • 2015-10-26
  • 2012-04-04
  • 2017-08-22
  • 1970-01-01
  • 2016-07-19
  • 2015-12-31
  • 1970-01-01
  • 2012-01-08
相关资源
最近更新 更多