【问题标题】:Validation : how to check if the file being uploaded is in excel format? - Apache POI验证:如何检查上传的文件是否为 excel 格式? - 阿帕奇 POI
【发布时间】:2011-12-18 18:20:46
【问题描述】:

有什么方法可以检查上传的文件是否为 excel 格式?我正在使用 Apache POI 库读取 excel,并在读取文件时检查上传的文件扩展名。

获取扩展的代码sn-p

String suffix = FilenameUtils.getExtension(uploadedFile.getName());

礼貌BalusC : uploading-files-with-jsf

String fileExtension = FilenameUtils.getExtension(uploadedFile.getName());
if ("xls".equals(fileExtension)) {
//rest of the code
}

我敢肯定,这不是正确的验证方式。

浏览按钮的示例代码

<h:inputFileUpload id="file" value="#{sampleInterface.uploadedFile}" 
        valueChangeListener="#{sampleInterface.uploadedFile}" />

上传按钮的示例代码

<h:commandButton action="#{sampleInterface.sampleMethod}" id="upload" 
value="upload"/>

用户可以将文档或电影文件的扩展名更改为“xls”并上传,然后在读取文件时肯定会抛出异常。

只是希望有人能给我一些意见。

【问题讨论】:

  • 您需要做多少验证?足以检查是否有人没有上传 csv?足以知道他们没有上传不同的办公文件(例如 .ppt)?或者足以知道它可以毫无错误地加载(不被截断等)?
  • 是的,大多数情况都是这样。
  • 如果你想检查所有这些,那么你唯一的选择就是如 BalusC 所说,并尝试在 POI 中打开它,如果格式错误则捕获异常。 (如果您只想做一些更简单的检查,那么还有其他选择)

标签: validation jsf apache-poi


【解决方案1】:

在将其提供给 POI 之前,您无法对其进行检查。只需捕获 POI 在解析过程中可能抛出的异常。如果它引发异常,那么您可以向最终用户显示一个FacesMessage,表明上传的文件不是支持的 excel 格式。

【讨论】:

  • 您好 BalusC,感谢您的回复,它确实有效,但它也抛出了一些方法未找到异常。方法定义得很好,但仍然抛出异常 Link -> stackoverflow.com/questions/8593058/exception-jsf
  • 你到底在说什么异常?显示堆栈跟踪。
  • 等等,valueChangeListenervalue 属性具有相同的 EL 表达式!这完全没有意义。我认为您实际上根本不需要valueChangeListener。删除它。
【解决方案2】:

请尽量为发帖者提供更多帮助。当然你可以在 poi 之前测试。 在 try/catch 之前执行的常规测试包括以下内容。我建议采用快速失败的方法。

  1. 这是一个“好”的文件吗?

    1. 如果 file.isDirectory() -> 死亡并退出。
    2. 如果 !file.isReadable() -> 死亡并退出。
    3. 如果 file.available 死亡并退出(包括文件大小为零)
    4. 如果 file.size >= 一些可笑的大数字(检查您最大的 excel 文件并乘以 10)
  2. 文件看起来不错,但内容像 Excel 吗?

    1. 它是否以“ÐÏà”开头 -> 如果不是,则死亡。
    2. 它是否包含文本“Sheet”-> 如果没有,则死亡
    3. 我期望你们在这里提供的其他一些内部 excel 字节。

【讨论】:

  • 你提到的常规测试对上传的文件完全没有意义。它始终是非目录,始终可读且始终“可用”。文件大小通常在上传器设置中配置(例如,用户最多可以上传 10MB 左右)。这些测试可能对本地磁盘文件系统指针有意义,但在这个特定问题中根本不是这种情况。顺便说一句,您误解了available() 的作用(不用担心,几乎每个初学者都不会理解它)。此外,您的内容测试绝对没有意义。这些是业务特定要求。
  • @BalusC 那么如何使用 available() 呢?以及如何配置上传器设置?
  • 阅读 javadoc 的含义。如果您不了解它,请不要使用它。无论如何,您都不需要它来编写上传的文件。
猜你喜欢
  • 1970-01-01
  • 2014-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多