Java 使用Struts2 s:文件控件获取实际文件类型

Java 使用Struts2 s:文件控件获取实际文件类型,java,jsp,file-upload,file-io,struts2,Java,Jsp,File Upload,File Io,Struts2,我正在使用Struts2文件控件s:File JSP代码 <s:file name="user.batchFile" /> 它返回应用程序/八位字节流 我正在上传CSV文件。是我获取文本/csv的任何方式。我想验证文件,用户应该只上传实际的文件。不是其他系统文件。或者也可以将其ext更改为csv 如何获得实际的文件类型?我认为您需要定义以下mutator方法 private File file; private String contentType; private Stri

我正在使用Struts2文件控件s:File

JSP代码

<s:file name="user.batchFile" />
它返回应用程序/八位字节流

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


如何获得实际的文件类型?

我认为您需要定义以下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(文件文件):包含上载文件内容的文件
setXContentType(String contentType):上传文件的mime类型
setXFileName(字符串文件名):实际文件名

详情请参阅官方文件

此外,如果要限制上载文件类型,甚至可以使用声明性as

<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>

图像/jpeg,图像/gif
good_result.jsp

但是,使用通过
setXContentType(String contentType)
方法传递给Action类的信息以编程方式限制文件类型是非常灵活的,我相信您需要定义以下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(文件文件):包含上载文件内容的文件
setXContentType(String contentType):上传文件的mime类型
setXFileName(字符串文件名):实际文件名

详情请参阅官方文件

此外,如果要限制上载文件类型,甚至可以使用声明性as

<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>

图像/jpeg,图像/gif
good_result.jsp

但是,使用通过
setXContentType(String contentType)
方法传递到Action类的信息以编程方式限制文件类型非常灵活,因此不应使用
javax.activation.MimetypesFileTypeMap
mime映射。您应该改为通过获取mime类型。它使用
web.xml的
条目,您可以自定义/覆盖这些条目。例如,在Tomcat中,默认列表在
/conf/web.xml
中定义。您可以将其添加到那里或webapp自己的
web.xml
中,如下所示:

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

csv
文本/csv
然后你可以得到如下结果:

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

请注意,这取决于正确的文件扩展名。如果文件具有不同的扩展名,则需要在该扩展名上抛出验证错误。如果您想验证实际的文件内容,只需通过一个合适的CSV解析器即可。如果它阻塞了,那么也会抛出一个验证错误。

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

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

csv
文本/csv
然后你可以得到如下结果:

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

请注意,这取决于正确的文件扩展名。如果文件具有不同的扩展名,则需要在该扩展名上抛出验证错误。如果您想验证实际的文件内容,只需通过一个合适的CSV解析器即可。如果它阻塞,则也会抛出验证错误。

如果您需要在不依赖文件扩展名的情况下识别mimetype,则有一种方法可以帮助您在获得文件后确定mimetype,但是,在操作中记录的内容取决于客户端和配置。如果您需要在不依赖文件扩展名的情况下识别mimetype,则有一种方法可以帮助您在获得文件后确定mimetype,但在操作中记录的内容方面,您将取决于客户端和配置。