【问题标题】:Getting actual file type using Struts2 s:file control使用 Struts2 获取实际文件类型:文件控制
【发布时间】:2011-12-23 13:13:34
【问题描述】:

我正在使用 Struts2 文件控件 s:file。

JSP 代码

<s:file name="user.batchFile" />

动作类代码

new MimetypesFileTypeMap().getContentType(getUser().getBatchFile());

它返回 application/octet-stream。

我正在上传 CSV 文件。他们有什么方法可以获取文本/csv。我想验证文件,该用户应该只上传实际文件。不是其他系统文件。或者也不要将它的 ext 更改为 csv。

我怎样才能得到实际的文件类型?

【问题讨论】:

  • 如果您需要在不依赖文件扩展名的情况下识别 mimetype,有一个 variety of libraries 可以帮助您在获得文件后确定 mimetype,但您将受客户端和配置的支配动作中记录的内容。

标签: java jsp file-upload file-io struts2


【解决方案1】:

我相信你需要定义以下 mutator 方法

 private File file;
 private String contentType;
 private String filename;

 public void setUpload(File file) {
         this.file = file;
      }

      public void setUploadContentType(String contentType) {
         this.contentType = contentType;
      }

      public void setUploadFileName(String filename) {
         this.filename = filename;
      }

在哪里

setX(File file) : The file that contains the content of the uploaded file setXContentType(String contentType) : The mime type of the uploaded file setXFileName(String fileName) :Actual file name

详情请阅读官方文档

file-upload

how-do-we-upload-files

此外,如果您想限制上传文件类型,您甚至可以使用声明式作为

<action name="doUpload" class="com.example.UploadAction">
    <interceptor-ref name="basicStack"/>
    <interceptor-ref name="fileUpload">
        <param name="allowedTypes">image/jpeg,image/gif</param>
    </interceptor-ref> 
    <result name="success">good_result.jsp</result>
</action>

但是使用通过setXContentType(String contentType) 方法传递给您的 Action 类的信息以编程方式限制文件类型非常灵活

【讨论】:

    【解决方案2】:

    您不应使用javax.activation.MimetypesFileTypeMap mime 映射。您应该改为通过ServletContext#getMimeType() 获取mime 类型。它使用您可以自定义/覆盖的web.xml&lt;mime-mapping&gt; 条目。例如,在 Tomcat 中,默认列表在 /conf/web.xml 中定义。您可以将其添加到那里或 webapp 自己的 web.xml 中,如下所示:

    <mime-mapping>
        <extension>csv</extension>
        <mime-type>text/csv</mime-type>
    </mime-mapping>
    

    那么就可以得到如下:

    String contentType = ServletActionContext.getServletContext().getMimeType(fileName);
    // ...
    

    请注意,这依赖于正确的文件扩展名。如果文件具有不同的扩展名,那么您需要对其抛出验证错误。如果您想验证实际的文件内容,只需将其通过一个体面的 CSV 解析器即可。如果它阻塞了,那么也会抛出一个验证错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-11
      • 1970-01-01
      • 1970-01-01
      • 2015-03-23
      相关资源
      最近更新 更多