用于validationPDF和Excel文件types的模式

我有一个networking应用程序,允许用户上传附件; 但是,我想限制用户只有某些文件types – Adob​​e PDF和MS Excel。 原因是在用户提交文档进行处理和工作stream程之前,我将汇总一些附件并创build一个PDF报告。

我做了一些研究和转换的DOC(X),RTF等…将是头痛。 另外,如果附件全都是PDF格式的话,那么每个人都将“理论上”获得更好的可移植性。

目前我正在检查MIMEtypes –

PDF – "application/pdf"

XLS(X) –

  • "application/vnd.ms-excel"
  • "application/msexcel"
  • "application/x-msexcel"
  • "application/x-ms-excel"
  • "application/x-excel"
  • "application/x-dos_ms_excel"
  • "application/xls"
  • "application/x-xls"

这很好,除了我注意到,我可以采取例如.docx文件,并将其扩展名为.pdf并成功绕过此检查。

为了弥补这一点,我打算进一步检查实际文件的标题。

根据这个文件签名库

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

到目前为止,我有执行此检查的框架代码 –

**编辑以反映答案**

 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方法来做到这一点。 但是,我也读过一些人build议将fileData转换为string,然后使用正则expression式。

任何想法将不胜感激。

奖金分,如果你可以帮助我开始填写我的骨架代码的情况下。 我比特级的逻辑知识是生锈的。 这就是我过去一年编写高级客户端代码的过程。

永远不要相信来自客户端的传入请求,标头值可能会改变,并不能反映请求正文中的内容。

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

检查一个文档是否为PDF,例如使用iText打开它,对于Excel,尝试使用Apache POI打开它。