用于validationPDF和Excel文件types的模式
我有一个networking应用程序,允许用户上传附件; 但是,我想限制用户只有某些文件types – Adobe 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打开它。