用于提交文件的Java代理Servlet

时间:2010-03-18 16:56:42

标签: java gwt servlets proxy pandastream

我正在尝试将Panda用于我的GWT应用程序。我可以使用

将视频直接上传到我的熊猫服务器
POST MY_PANDA_SERVER/videos/MY_VIDEO_ID/upload

但是我想将我的熊猫服务器隐藏在我的J2EE(glassfish)服务器之后。我想实现这个目标:

  1. 开始上传到我的J2EE服务器上的某个servlet
  2. 验证用户
  3. 将文件发布到我的熊猫服务器,同时仍然上传到servlet
  4. 理想情况下,我希望永远不会将文件存储在J2EE服务器上,而只是将其用作代理来访问熊猫服务器。

4 个答案:

答案 0 :(得分:6)

Commons FileUpload很不错,但在你的情况下还不够。在提供文件项(和流)之前,它将在内存中解析整个主体。你对个别物品不感兴趣。您基本上只想透明地将请求主体从一个流传输到另一个端,而无需改变它或以任何方式将其存储在内存中。 FileUpload只会将请求主体解析为一些“可用的”Java对象,而HttpClient只会根据这些Java对象再次创建相同的请求主体。这些Java对象也会消耗内存。

您不需要使用库(或者必须Commons IO使用forIOUtils#copy()循环替换为oneliner。只需基本的Java .NET和IO API即可。这是一个启动示例:

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    URLConnection connection = new URL("http://your.url.to.panda").openConnection();
    connection.setDoOutput(true); // POST.
    connection.setRequestProperty("Content-Type", request.getHeader("Content-Type")); // This one is important! You may want to check other request headers and copy it as well.

    // Set streaming mode, else HttpURLConnection will buffer everything.
    int contentLength = request.getContentLength();
    if (contentLength > -1) {
        // Content length is known beforehand, so no buffering will be taken place.
        ((HttpURLConnection) connection).setFixedLengthStreamingMode(contentLength);
     } else {
        // Content length is unknown, so send in 1KB chunks (which will also be the internal buffer size).
        ((HttpURLConnection) connection).setChunkedStreamingMode(1024);
    }

    InputStream input = request.getInputStream();
    OutputStream output = connection.getOutputStream();
    byte[] buffer = new byte[1024]; // Uses only 1KB of memory!

    for (int length = 0; (length = input.read(buffer)) > 0;) {
        output.write(buffer, 0, length);
        output.flush();
    }

    output.close();
    connection.getInputStream(); // Important! It's lazily executed.
}

答案 1 :(得分:0)

您可以使用apache commons file upload接收文件。然后,您可以使用http client通过POST将文件上传到您的熊猫服务器。使用apache commons文件上传,您可以在内存中处理该文件,这样您就不必存储它。

答案 2 :(得分:0)

根据Enrique的回答,我还建议使用FileUpload和HttpClient。 FileUpload可以为您提供stream上传的文件:

// Create a new file upload handler
ServletFileUpload upload = new ServletFileUpload();

// Parse the request
FileItemIterator iter = upload.getItemIterator(request);
while (iter.hasNext()) {
    FileItemStream item = iter.next();
    String name = item.getFieldName();
    InputStream stream = item.openStream();
    if (item.isFormField()) {
        System.out.println("Form field " + name + " with value "
            + Streams.asString(stream) + " detected.");
    } else {
        System.out.println("File field " + name + " with file name "
            + item.getName() + " detected.");
        // Process the input stream
        ...
    }
}

然后,您可以使用HttpClientHttpComponents进行POST。您可以找到示例here

答案 3 :(得分:0)

最好的解决方案是使用apache-camel servlet组件: http://camel.apache.org/servlet.html