这里作者讲述了如何制作一个非常清晰详细的上传方法,我认为这是最好的方法。
setXFileName(String fileName)
设置器,则可以将文件名获取为客户端机器上的文件名。
要将文件与原始文件名一起保留,而不是像上传到服务器时那样获得临时文件名,您可以执行以下操作:
String targetXFilename = PATH_TO_DIRECTORY + "/" + getXFileName();
File targetXFile = new File(targetXFilename);
try {
FileUtils.copyFile(getXFile(), targetXFile);
} catch(IOException e) {
return Consts.RET_ERROR_EXCEPTION_IO;
}
首先我们需要知道两个基本事实:
name
属性处理字段。所以没有name
的字段无法被提交。基于此,Struts 2自动进行配对工作:如果一个form
被提交,则Struts 2会迭代所有带有name
的字段;一旦找到一个类型为file
的字段,则获取其name
并在action类中搜索具有以下模式的getter/setter:
name
是xxx,则搜索xxx
、xxxContentType
和xxxFileName
的getter/setter。如果找到了这些getter/setter,将文件内容存储到xxx
中,该文件的内容类型存储在xxxContentType
中,文件名存储在xxxFileName
中。
多个文件也适用相同的方法,这三个变量必须是Array/
Collection
类型。
因此,在定义操作变量时,我们必须遵循这些规则,以获取操作类中所需的文件名。如果您的文件输入字段命名为myFile
,则您的操作类中必须有:
File myFile;
String myFileContentType;
String myFileFileName;
对于多文件上传:
File[] myFile;
String[] myFileContentType;
String[] myFileFileName;
文件名不包含路径(我使用的是FF所以是这个情况。在其他浏览器中,它们可能以完整名称存储)。要在服务器端保存它们,您必须为xxx
中的每个文件分配xxxFileName
中的名称。所以你已经完成了一半。它们按相同顺序存储,因此您可以使用相同的索引迭代两个数组。像这样:
for(int i=0; i < xxx.length(); i++) {
saveFile(xxx[i], xxxFileName[i]);
//saveFile() is a method you implement to save files. FileWriter, etc.
}
setXFileName
并把名称设置为 _MyFile.jpg_。据我所知,这是 Struts2 的默认行为。如果您没有得到这种默认行为,可能是您代码/情况中的其他因素影响了它。 - nmc