我正在尝试将Panda用于我的GWT应用程序。我可以使用
将视频直接上传到我的熊猫服务器POST MY_PANDA_SERVER/videos/MY_VIDEO_ID/upload
但是我想将我的熊猫服务器隐藏在我的J2EE(glassfish)服务器之后。我想实现这个目标:
理想情况下,我希望永远不会将文件存储在J2EE服务器上,而只是将其用作代理来访问熊猫服务器。
答案 0 :(得分:6)
Commons FileUpload很不错,但在你的情况下还不够。在提供文件项(和流)之前,它将在内存中解析整个主体。你对个别物品不感兴趣。您基本上只想透明地将请求主体从一个流传输到另一个端,而无需改变它或以任何方式将其存储在内存中。 FileUpload只会将请求主体解析为一些“可用的”Java对象,而HttpClient只会根据这些Java对象再次创建相同的请求主体。这些Java对象也会消耗内存。
您不需要使用库(或者必须Commons IO使用for
将IOUtils#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
...
}
}
然后,您可以使用HttpClient或HttpComponents进行POST。您可以找到示例here。
答案 3 :(得分:0)
最好的解决方案是使用apache-camel servlet组件: http://camel.apache.org/servlet.html