gpt4 book ai didi

java - 验证 PDF 和 Excel 文件类型的模式

转载 作者:行者123 更新时间:2023-12-01 12:54:01 25 4
gpt4 key购买 nike

我有一个网络应用程序,允许用户上传附件;但是,我想限制用户只能使用某些文件类型 - Adob​​e PDF 和 MS Excel。原因是在用户提交文档进行处理和工作流程之前,我将汇总一些附件并创建一个 PDF 报告。

我做了一些研究,转换 DOC(X)、RTF 等......会很头痛。另外,如果附件全部为 PDF 格式,“理论上”每个人都会获得更好的查看便携性。

目前我正在检查 mime 类型 -

PDF - “应用程序/pdf”

XLS(X) -

  • “application/vnd.ms-excel”
  • “应用程序/msexcel”
  • “应用程序/x-msexcel”
  • “应用程序/x-ms-excel”
  • “应用程序/x-excel”
  • “application/x-dos_ms_excel”
  • “应用程序/xls”
  • “应用程序/x-xls”

这工作得很好,除了我注意到我可以使用 .docx 文件并将其扩展名更改为 .pdf 并成功绕过此检查.

为了解决这个问题,我计划进一步检查实际文件的 header 。

根据this library文件签名数

PDF 将具有以下标题 -

25 50 44 46

并且它将有以下预告片之一 -

  • 0A 25 25 45 4F 46 (.%​​%EOF)
  • 0A 25 25 45 4F 46 0A (.%%EOF.)
  • 0D 0A 25 25 45 4F 46 0D 0A (..%%EOF..)
  • 0D 25 25 45 4F 46 0D (.%%EOF.)

到目前为止,我已经有了执行此检查的框架代码 -

** 编辑以反射(reflect)答案 **

public boolean confirmAttachmentAuthenticity(ProposalDevelopmentForm form, String mimeType) {
boolean authentic = true;
// Case: User is attempting to upload a "PDF" document
if (mimeType.equals(ADOBE_PDF_CONTENT_TYPE)) {
try {
InputStream inputStream = form.getNewNarrative().getNarrativeFile().getInputStream();
PdfReader pdfReader = new PdfReader(inputStream);
int numberOfPages = pdfReader.getNumberOfPages();
if (numberOfPages > 0) {
// Success - valid PDF
info(form.getNewNarrative().getNarrativeFile().getFileName() + " validated authentic Adobe PDF file");
}
}
catch(IOException ioe) {
// Failure - masquerading PDF
authentic = false;
info(form.getNewNarrative().getNarrativeFile().getFileName() + " is not an authentic Adobe PDF file.");
reportError("newNarrative.narrativeFile",
KeyConstants.ERROR_ATTACHMENT_PDF_NOT_AUTHENTIC,
form.getNewNarrative().getNarrativeFile().getFileName());
}
catch (Exception e) {
// Failure - other causes
authentic = false;
info(form.getNewNarrative().getNarrativeFile().getFileName() + " could not be authenticated at this time.");
e.printStackTrace();
reportError("newNarrative.narrativeFile",
KeyConstants.ERROR_ATTACHMENT_TYPE_CORRUPTED,
form.getNewNarrative().getNarrativeFile().getFileName());
}
}
// Case: User is attempting to upload an "EXCEL" spreadsheet
else {
try {
InputStream inputStream = form.getNewNarrative().getNarrativeFile().getInputStream();
POIFSFileSystem fileSystem = new POIFSFileSystem(inputStream);
HSSFWorkbook workBook = new HSSFWorkbook(fileSystem);
int numberOfSheets = workBook.getNumberOfSheets();
if (numberOfSheets > 0) {
// Success - valid Excel Spreadsheet
info(form.getNewNarrative().getNarrativeFile().getFileName() + " validated authentic MS Excel file");
}
}
catch(IOException ioe) {
// Failure - masquerading XLS(X)
authentic = false;
info(form.getNewNarrative().getNarrativeFile().getFileName() + " is not an authentic MS Excel file.");
reportError("newNarrative.narrativeFile",
KeyConstants.ERROR_ATTACHMENT_XLS_NOT_AUTHENTIC,
form.getNewNarrative().getNarrativeFile().getFileName());
}
catch (Exception e) {
// Failure - other causes
authentic = false;
info(form.getNewNarrative().getNarrativeFile().getFileName() + " could not be authenticated at this time.");
e.printStackTrace();
reportError("newNarrative.narrativeFile",
KeyConstants.ERROR_ATTACHMENT_TYPE_CORRUPTED,
form.getNewNarrative().getNarrativeFile().getFileName());
}
}
return authentic;
}

我认为最好的方法是使用 BinarySearch 方法来执行此操作。但是,我也读过一些帖子,人们建议将 fileData 转换为字符串,然后使用正则表达式。

如有任何想法,我们将不胜感激。

如果您能帮助我开始填写这两种情况的框架代码,我会加分。我的逐位逻辑知识已经生锈了。这就是我在过去一年中编写大部分高级客户端代码所得到的结果。

最佳答案

不要永远信任来自客户端的传入请求, header 值可能会更改,并且不会反射(reflect)请求正文中的内容。

使用第三方库来检查文件是否是 PDF、Excel 或其他文件。

要检查文档是否为 PDF,请尝试使用 iText 打开它。 ,对于 Excel 尝试使用 Apache POI 打开它.

关于java - 验证 PDF 和 Excel 文件类型的模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24022416/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com