Java 公用文件上载在Servlet中不起作用
我有一个servlet,用于处理一个非常大的文件的上传。我正在尝试使用commons fileupload来处理它。目前,我试图上传的文件是287MB 我设置了FileItemFactory和ServletFileUpload,然后在ServletFileUpload上设置了一个非常大的最大文件大小 不幸的是,当我尝试创建FileItemIterator时,什么都没有发生。表单设置了正确的操作、多部分编码和POST方法 有人能帮忙吗?servlet的doPost()发布在下面:Java 公用文件上载在Servlet中不起作用,java,servlets,apache-commons-fileupload,Java,Servlets,Apache Commons Fileupload,我有一个servlet,用于处理一个非常大的文件的上传。我正在尝试使用commons fileupload来处理它。目前,我试图上传的文件是287MB 我设置了FileItemFactory和ServletFileUpload,然后在ServletFileUpload上设置了一个非常大的最大文件大小 不幸的是,当我尝试创建FileItemIterator时,什么都没有发生。表单设置了正确的操作、多部分编码和POST方法 有人能帮忙吗?servlet的doPost()发布在下面: @Overrid
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// ensure that the form is multipart encoded since we are uploading a file
if (!ServletFileUpload.isMultipartContent(req)) {
//throw new FileUploadException("Request was not multipart");
log.debug("Request was not multipart. Returning from call");
}
// create a list to hold all of the files
List<File> fileList = new ArrayList<File>();
try {
// setup the factories and file upload stuff
FileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
upload.setFileSizeMax(999999999);
// create a file item iterator to cycle through all of the files in the req. There SHOULD only be one, though
FileItemIterator iterator = upload.getItemIterator(req);
// iterate through the file items and create a file item stream to output the file
while (iterator.hasNext()) {
// get the file item stream from the iterator
FileItemStream fileItemStream = iterator.next();
// Use the Special InputStream type, passing it the stream and the length of the file
InputStream inputStream = new UploadProgressInputStream(fileItemStream.openStream(), req.getContentLength());
// create a File from the file name
String fileName = fileItemStream.getName(); // this only returns the filename, not the full path
File file = new File(tempDirectory, fileName);
// add the file to the list
fileList.add(file);
// Use commons-io Streams to copy from the inputstrea to a brand-new file
Streams.copy(inputStream, new FileOutputStream(file), true);
// close the inputstream
inputStream.close();
}
} catch (FileUploadException e) {
e.printStackTrace();
}
// now that we've save the file, we can process it.
if (fileList.size() == 0) {
log.debug("No File in the file list. returning.");
return;
}
for (File file : fileList) {
String fileName = file.getName();
BufferedReader reader = new BufferedReader(new FileReader(fileName));
String line = reader.readLine();
List<Feature> featureList = new ArrayList<Feature>(); // arraylist may not be the best choice since I don't know how many features I'm importing
while (!line.isEmpty()) {
String[] splitLine = line.split("|");
Feature feature = new Feature();
feature.setId(Integer.parseInt(splitLine[0]));
feature.setName(splitLine[1]);
feature.setFeatureClass(splitLine[2]);
feature.setLat(Double.parseDouble(splitLine[9]));
feature.setLng(Double.parseDouble(splitLine[10]));
featureList.add(feature);
line = reader.readLine();
}
file.delete(); // todo: check this to ensure it won't blow up the code since we're iterating in a for each
reader.close(); // todo: need this in a finally block somewhere to ensure this always happens.
try {
featureService.persistList(featureList);
} catch (ServiceException e) {
log.debug("Caught Service Exception in FeatureUploadService.", e);
}
}
}
@覆盖
受保护的void doPost(HttpServletRequest-req,HttpServletResponse-resp)引发ServletException,IOException{
//确保表单是多部分编码的,因为我们正在上载文件
如果(!ServletFileUpload.isMultipartContent(请求)){
//抛出新的FileUploadException(“请求不是多部分”);
调试(“请求不是多部分的,从调用返回”);
}
//创建一个列表来保存所有文件
List fileList=new ArrayList();
试一试{
//设置工厂并上传文件
FileItemFactory=new DiskFileItemFactory();
ServletFileUpload upload=新的ServletFileUpload(工厂);
upload.setFileSizeMax(99999999);
//创建一个文件项迭代器,循环遍历req中的所有文件
FileItemIterator迭代器=upload.getItemIterator(req);
//迭代文件项并创建文件项流以输出文件
while(iterator.hasNext()){
//从迭代器获取文件项流
FileItemStream FileItemStream=iterator.next();
//使用特殊的InputStream类型,将流和文件长度传递给它
InputStream InputStream=new UploadProgressInputStream(fileItemStream.openStream(),req.getContentLength());
//根据文件名创建一个文件
String fileName=fileItemStream.getName();//这只返回文件名,而不是完整路径
File File=新文件(tempDirectory,fileName);
//将文件添加到列表中
fileList.add(文件);
//使用commons io Streams从inputstrea复制到全新的文件
复制(inputStream,新文件OutputStream(文件),true);
//关闭输入流
inputStream.close();
}
}捕获(文件上载异常){
e、 printStackTrace();
}
//现在我们已经保存了文件,可以处理它了。
if(fileList.size()==0){
debug(“文件列表中没有文件。正在返回”);
返回;
}
用于(文件:文件列表){
字符串文件名=file.getName();
BufferedReader reader=新的BufferedReader(新文件读取器(文件名));
字符串行=reader.readLine();
List featureList=new ArrayList();//ArrayList可能不是最佳选择,因为我不知道要导入多少功能
而(!line.isEmpty()){
String[]splitLine=line.split(“|”);
特征=新特征();
setId(Integer.parseInt(splitLine[0]);
feature.setName(splitLine[1]);
setFeatureClass(分割线[2]);
setLat(Double.parseDouble(splitLine[9]);
setLng(Double.parseDouble(splitLine[10]);
功能列表。添加(功能);
line=reader.readLine();
}
file.delete();//todo:检查此项以确保它不会破坏代码,因为我们正在以for-each的方式进行迭代
reader.close();//todo:需要在finally块中的某个位置使用此命令,以确保始终发生这种情况。
试一试{
featureService.persistList(featureList);
}捕获(服务异常e){
debug(“FeatureUploadService中捕获的服务异常。”,e);
}
}
}
是唯一可用的请求参数文件项吗?因为您可能需要填写一张支票:
if (!fileItemStream.isFormField()){
// then process as file
否则你会出错。从表面上看,您的代码看起来不错:Tomcat日志中没有错误?是唯一可用的请求参数文件项吗?因为您可能需要填写一张支票:
if (!fileItemStream.isFormField()){
// then process as file
否则你会出错。从表面上看,您的代码看起来不错:Tomcat日志中没有错误?这是一个极其愚蠢的问题。我在GWT UiBinder中取消了FileUpload条目的name属性。谢谢大家的帮助。这是一个极其愚蠢的问题。我在GWT UiBinder中取消了FileUpload条目的name属性。谢谢大家的帮助。您需要在html表单中添加
enctype='multipart/form data'
您需要在html表单中添加enctype='multipart/form data'
,只有一个文件上载字段和两个按钮(提交和取消)。不过,我已经忘记了这一点,谢谢。该项目是一个以托管模式(jetty)运行的GWT项目。但是,我没有看到抛出任何异常。嗯,不确定:从未尝试过使用GWT上传文件。它不是以某种奇怪的方式破坏了请求吗?只有一个文件上传字段和两个按钮(提交和取消)。不过,我已经忘记了这一点,谢谢。该项目是一个以托管模式(jetty)运行的GWT项目。但是,我没有看到抛出任何异常。嗯,不确定:从未尝试过使用GWT上传文件。它不是以某种奇怪的方式破坏了请求吗?“什么都没有发生”,所以代码在这一点上被卡住并永远挂在那里?它不是在忙着阅读请求正文吗?或者hasNext()
是否立即返回false
?请更具体地说明这个问题。执行哪些行,哪些不执行。哦,如果你的第一张支票根本没有回来……这很公平。失败点的开始似乎是对upload.getItemIterator(req)的调用。文件项