为什么无法使用FileUpload上传三个文件?

时间:2011-03-05 23:55:54

标签: java jsp servlets file-upload apache-commons-fileupload

我正在尝试将三张图片上传到我的服务器,正在运行,但总是上传用户选择的最后一个文件,而不是上传的三张文件。

这是我的代码:

protected void doPost(HttpServletRequest request, HttpServletResponse response){
    boolean multipart = ServletFileUpload.isMultipartContent(request);

    if (multipart) {
        DiskFileItemFactory fileItemFactory = new DiskFileItemFactory();

        fileItemFactory.setSizeThreshold(5 * 1024 * 1024); //5 MB
        fileItemFactory.setRepository(tmpDir);

        ServletFileUpload uploadHandler = new ServletFileUpload(fileItemFactory);
        try {
            List items = uploadHandler.parseRequest(request);

            Iterator itr = items.iterator();

            while (itr.hasNext()) {
                FileItem item = (FileItem) itr.next();

                File file = new File(dir, generateNewName());
                item.write(file);
            }
        } catch (FileUploadException ex) {
        } catch (Exception ex) {
        }
    }
}

- UPDATE:

<html>
    <head>
        <title>Upload</title>
    </head>
    <body>
        <form action="Upload" method="post" enctype="multipart/form-data">
            <input type="file" name="file1" />
            <br />

            <input type="file" name="file2" />
            <br />

            <input type="file" name="file3" />
            <br />

            <input type="submit" value="Enviar" />

        </form>
    </body>

更新2:

我发现了我的错误: 当我调用方法generateNewName()返回一个包含(日期)+(小时)+(毫秒)的字符串时,我认为这应该足以每次生成一个新名称但总是返回相同的名称,所以这样做每次都重写相同的文件。

对于给您带来的任何不便表示歉心,感谢您的帮助。

祝你好运, Valter Henrique。

1 个答案:

答案 0 :(得分:1)

即使您已经确定了自己的问题(对您而言,我建议您自己发布这个问题的答案),我仍然建议您使用File#createTempFile()来生成一个独特的问题文件名。这个Java SE提供的API保证在给定路径上创建一个唯一的文件。

以下是根据上传文件的名称/扩展名执行此操作的示例。

String fileName = FilenameUtils.getName(item.getName());
String fileNamePrefix = FilenameUtils.getBaseName(fileName) + "_";
String fileNameSuffix = "." + FilenameUtils.getExtension(fileName);

File file = File.createTempFile(fileNamePrefix, fileNameSuffix, dir);
item.write(file);
// ...

FilenameUtils来自Commons IO,无论如何你应该已经在类路径中了,因为它是Commons FileUpload的必需依赖项。