我使用Struts 2上传文件,然后内容进入数据库。在数据库中,我存储文件内容,内容类型和文件名,因为它在客户端机器上(无论客户在选择要上载的文件时在“浏览”中看到什么 - 例如'myFIle.txt')。 但是,问题是,当我将文件存储到数据库时,它发生在服务器上,那时我只看到文件名,因为它是在上传到TEMP DIRECTORY ON SERVER之后。 (类似于373_393jfu_39.tmp)
我们如何访问客户端上实际存在的文件名? 我知道出于安全原因,struts会以某种方式隐藏上传过程......但是有没有办法在黑客之间进行攻击?
答案 0 :(得分:9)
http://java.dzone.com/articles/struts2-tutorial-part-67在这里,他解释了如何进行非常清晰和详细的上传,我认为这是最好的方式。
答案 1 :(得分:8)
请参阅http://struts.apache.org/2.0.14/docs/file-upload.html
上的示例如果您提供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;
}
答案 2 :(得分:1)
首先我们知道两个基本事实:
form
时,服务器端根据标记中的name
属性处理字段。因此,无法提交没有name
的字段。基于此,Struts 2自动完成这样的配对工作:如果提交了form
,Struts 2将使用name
迭代所有字段;找到file
类型的字段后,获取其name
并使用此模式在操作类中搜索getter / setter:
name
是xxx,请搜索xxx
,xxxContentType
,xxxFileName
的获取者/设置者。如果找到,请将文件内容存储到xxx
,将此文件的内容类型存储在xxxContentType
中,将文件名存储在xxxFileName
中。
同样适用于倍数文件,这三个变量的类型必须为Array
/ Collection
。
因此,当我们定义动作变量时,我们必须遵循这些规则,以获取动作类中所需的文件名。如果您的文件输入字段名为myFile
,则在您的操作类中,您必须具有:
File myFile;
String myFileContentType;
String myFileFileName;
多次上传:
File[] myFile;
String[] myFileContentType;
String[] myFileFileName;
文件名存储时不带路径(我使用的FF就是我的情况。也许在其他导航器中,它们以全名存储)。要将它们保存在服务器端,您必须将xxxFileName
中的名称分配给xxx
中的每个文件。所以你在那里一半。它们以相同的顺序存储,因此您可以使用相同的索引迭代两个数组。像这样:
for(int i=0; i < xxx.length(); i++) {
saveFile(xxx[i], xxxFileName[i]);
//saveFile() is a method you implement to save files. FileWriter, etc.
}
答案 3 :(得分:-2)
谢谢大家。
但你所说的只是我正在谈论的内容。最后,您可以在服务器计算机上看到文件的名称。想象一个场景:用户打开浏览器并导航到我的应用程序页面。用户在计算机上“A”。服务器在计算机“B”上运行。当用户点击“浏览”按钮时,他选择一个文件“MyFile.jpg” - 位于他的计算机“A”上的文件。 Struts完成工作,并通过框架将文件上传到计算机“B”上的临时目录中。看看考试中的图片。显示在Taj Mahal图像上方的文件名称为ff_000_stuf.tmp - 这是服务器计算机上的临时文件。使用FileUtils.copyFile会将文件FROM THAT TEMP DIRECTORY在SERVER上复制到指定的任何位置。我的问题具体是关于如何获取文件的名称,因为它是在计算机“A” - “MyFile.jpg”上。有一些关于setFileName()和segFile()方法的东西,我试图放入动作类,但我不知道或不理解,如何调用这些方法。从示例中,我阅读了以下内容:
“字段userImageContentType和userImageFileName是可选的。如果提供了这些字段的setter方法,struts2将设置数据。”我试过了,也许“struts”正在调用那些,但我仍然看到名称中包含“fff_000.tmp”所有垃圾的文件名。
我解决了我的问题,但攻击FileUpload拦截器的代码,并将其中的一部分复制到我的Action类中。这样做了,但我不喜欢这个,因为它违背了框架的目的