我正在尝试上传图片。如果图像很小,则可以轻松上传。但是,如果我尝试上传高品质的大型壁纸,则需要永远。它显示上传89%并保持这样。我正在使用Apache commons api上传文件,并使用Inputstream
来阅读。这是我的代码示例:
ServletFileUpload upload = new ServletFileUpload();
response.setContentType("image/jpeg");
FileItemIterator iterator = upload.getItemIterator(request);
while (iterator.hasNext()) {
FileItemStream item = iterator.next();
InputStream stream = item.openStream();
if (item.isFormField()) {
LOGGER.debug("Got a form field: " + item.getFieldName());
} else {
LOGGER.debug("Got an uploaded file: " + item.getFieldName() + ", name = " + item.getName());
byte[] buf = new byte[stream.available()];
ServletOutputStream outputstream = response.getOutputStream();
while ((stream.read(buf)) != -1) {
outputstream.write(buf, 0, buf.length);
}
outputstream.close();
stream.close();
}
}
有什么办法可以使用上面的代码更快地上传图片吗?是否有任何api照顾它?我感谢任何帮助。感谢。
答案 0 :(得分:0)
您能明确大文件的大小和JVM的最大堆大小吗? (-Xmx java选项)
可能只是你的JVM不能获得足够的内存来正确管理你的图像。 因此,一个基本的解决方案可能是将堆大小的值增加到更大的文件大小。
答案 1 :(得分:0)
我认为你得到的是一个OOM,因为else块中的代码用stream.available分配一个字节数组来指定大小。如果您为InputStreams可用方法读取javadocs,则可用方法也可能返回流中的总字节数,因此不应将其用于分配缓冲区。可能你应该使用一个小的固定大小的缓冲区。