Struts 2文件上传 - 访问客户端文件名

时间:2011-08-02 15:51:33

标签: web-applications struts2

我使用Struts 2上传文件,然后内容进入数据库。在数据库中,我存储文件内容,内容类型和文件名,因为它在客户端机器上(无论客户在选择要上载的文件时在“浏览”中看到什么 - 例如'myFIle.txt')。 但是,问题是,当我将文件存储到数据库时,它发生在服务器上,那时我只看到文件名,因为它是在上传到TEMP DIRECTORY ON SERVER之后。 (类似于373_393jfu_39.tmp)

我们如何访问客户端上实际存在的文件名? 我知道出于安全原因,struts会以某种方式隐藏上传过程......但是有没有办法在黑客之间进行攻击?

4 个答案:

答案 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,请搜索xxxxxxContentTypexxxFileName的获取者/设置者。
    • 如果找到,请将文件内容存储到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类中。这样做了,但我不喜欢这个,因为它违背了框架的目的