Java 公用文件上载在Servlet中不起作用

Java 公用文件上载在Servlet中不起作用,java,servlets,apache-commons-fileupload,Java,Servlets,Apache Commons Fileupload,我有一个servlet,用于处理一个非常大的文件的上传。我正在尝试使用commons fileupload来处理它。目前,我试图上传的文件是287MB 我设置了FileItemFactory和ServletFileUpload,然后在ServletFileUpload上设置了一个非常大的最大文件大小 不幸的是,当我尝试创建FileItemIterator时,什么都没有发生。表单设置了正确的操作、多部分编码和POST方法 有人能帮忙吗?servlet的doPost()发布在下面: @Overrid

我有一个servlet,用于处理一个非常大的文件的上传。我正在尝试使用commons fileupload来处理它。目前,我试图上传的文件是287MB

我设置了FileItemFactory和ServletFileUpload,然后在ServletFileUpload上设置了一个非常大的最大文件大小

不幸的是,当我尝试创建FileItemIterator时,什么都没有发生。表单设置了正确的操作、多部分编码和POST方法

有人能帮忙吗?servlet的doPost()发布在下面:

@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)的调用。文件项