只需将所需的位置传递到FileItem#write()方法采用 Apache Commons FileUpload 自己的方法中描述的常用方法用户手册.
首先初始化上传文件夹init()
您的 servlet 的。
private File uploadFolder;
@Override
public void init() throws ServletException {
uploadFolder = new File("D:\\dev\\uploadservlet\\web\\uploads");
}
(如果需要,您可以从环境变量或属性文件中获取此信息)
然后从上传文件的文件名中提取基本名称和扩展名,并根据它生成唯一的文件名(您当然不希望当其他人碰巧上传同名文件时,先前上传的文件被覆盖,正确的?):
String fileName = FilenameUtils.getName(fileItem.getName());
String fileNamePrefix = FilenameUtils.getBaseName(fileName) + "_";
String fileNameSuffix = "." + FilenameUtils.getExtension(fileName);
File file = File.createTempFile(fileNamePrefix, fileNameSuffix, uploadFolder);
fileItem.write(file);
System.out.println("File successfully saved as " + file.getAbsolutePath());
// ...
(请注意,File#createTempFile()并不一定意味着它是一个临时文件,会在某个时候自动删除,不,在这种特殊情况下,它只是被用作一种工具,以便在给定文件夹中生成具有保证唯一文件名的文件)
The FilenameUtils由 Apache Commons IO 提供,您应该已经安装它,因为它是 Commons FileUpload 的依赖项。
请注意,您绝对不应该将其设置为第二个参数DiskFileItemFactory构造函数如其他答案所建议。正如其 javadoc 中明确提到的,这表示当上传的文件超过阈值大小时(即,当它们变得太大而无法完全保存在服务器内存中时),存储上传的文件的临时磁盘文件系统位置。该位置绝对不是用作上传文件的永久存储位置。 Commons FileUpload 会定期自动清理它。