我在Java中有一个后端服务,它将文件上传到服务器。但我似乎正在上传一些不需要的文件类型。
对于例如:如果我有一个foo.jpg文件并将其重命名为foo.pdf
,那么它就会被上传。如何查看foo.pdf
的实际内容
以下是我正在使用的代码
for (Part part : request.getParts()) {
if (part.getName().startsWith("file")) {
String filename = part.getHeader("content-disposition");
filename = filename.replaceFirst("(?i)^.*filename=\"([^\"]+)\".*$", "$1");
String fileType = part.getContentType();
DocumentUpload documentUpload = new DocumentUpload();
documentUpload.setFilename(filename);
documentUpload.setFileType(fileType);
documentUpload.setPayload(part.getInputStream());
response = documentService.save(documentUpload, uriInfo);
break;
}
}
答案 0 :(得分:2)
您可以使用A pache Tika library.
然后你可以找到这样的实际MIME类型:
public String getMimetype(BaseDocument document) {
ContentHandler contenthandler = new BodyContentHandler();
Metadata metadata = new Metadata();
metadata.set(Metadata.RESOURCE_NAME_KEY, document.getName());
Parser parser = new AutoDetectParser();
try {
parser.parse(new ByteArrayInputStream(document.getFile()), contenthandler, metadata, null);
} catch (IOException | SAXException | TikaException e) {
//throw
}
return metadata.get(Metadata.CONTENT_TYPE);
}
BaseDocument上面只是一个包含文档信息的自定义对象。
您还可以获得该文件的实际扩展名,如:
public String getExtension(BaseDocument document) {
TikaConfig config = TikaConfig.getDefaultConfig();
MediaType mediaType = null;
MimeType mimeType = null;
try {
mediaType = config.getMimeRepository().detect(new ByteArrayInputStream(document.getFile()), new Metadata());
mimeType = config.getMimeRepository().forName(mediaType.toString());
} catch (MimeTypeException | IOException e) {
//throw;
}
return mimeType.getExtension();
}