Java 使用ApacheTika检测文件扩展名会损坏文件
我试图检测作为InputStream传递的文件的文件扩展名,该扩展名被正确检测到,但此后文件往往会损坏。以下是我检测扩展的方法-Java 使用ApacheTika检测文件扩展名会损坏文件,java,apache,inputstream,apache-tika,Java,Apache,Inputstream,Apache Tika,我试图检测作为InputStream传递的文件的文件扩展名,该扩展名被正确检测到,但此后文件往往会损坏。以下是我检测扩展的方法- public static Optional<String> detectFileExtension(InputStream inputStream) { // To provide mark/reset functionality to the stream required by Tika. InputStream bufferedI
public static Optional<String> detectFileExtension(InputStream inputStream) {
// To provide mark/reset functionality to the stream required by Tika.
InputStream bufferedInputStream = new BufferedInputStream(inputStream);
String extension = null;
try {
MimeTypes mimeRepository = getMimeRepository();
MediaType mediaType = mimeRepository.detect(bufferedInputStream, new Metadata());
MimeType mimeType = mimeRepository.forName(mediaType.toString());
extension = mimeType.getExtension();
log.info("File Extension detected: {}", extension);
// Need to reset input stream pos marker since it was updated while detecting the extension
inputStream.reset();
bufferedInputStream.close();
} catch (MimeTypeException | IOException ignored) {
log.error("Unable to detect extension of the file from the provided stream");
}
return Optional.ofNullable(extension);
}
private static MimeTypes getMimeRepository() {
TikaConfig config = TikaConfig.getDefaultConfig();
return config.getMimeRepository();
}
公共静态可选detectFileExtension(InputStream InputStream){
//为Tika要求的流提供标记/重置功能。
InputStream bufferedInputStream=新的bufferedInputStream(InputStream);
字符串扩展名=null;
试一试{
MimeTypes mimeRepository=getMimeRepository();
MediaType MediaType=mimeRepository.detect(bufferedInputStream,new Metadata());
MimeType-MimeType=mimeRepository.forName(mediaType.toString());
extension=mimeType.getExtension();
info(“检测到文件扩展名:{}”,扩展名);
//需要重置输入流pos标记,因为它是在检测扩展时更新的
inputStream.reset();
bufferedInputStream.close();
}捕获(MimeTypeException | IOException被忽略){
log.error(“无法从提供的流中检测文件的扩展名”);
}
返回可选。不可用(扩展名);
}
私有静态MimeTypes getMimeRepository(){
TikaConfig config=TikaConfig.getDefaultConfig();
return config.getMimeRepository();
}
现在,当我尝试在扩展名检测后再次使用相同的InputStream保存此文件时,如-
byte[] documentContentByteArray = IOUtils.toByteArray(inputStream);
Optional<String> extension = FileTypeHelper.detectFileExtension(inputStream);
if (extension.isPresent()) {
fileName = fileName + extension.get();
} else {
log.warn("File: {} does not have a valid extension", fileName);
}
File file = new File("/tmp/" + fileName);
FileUtils.writeByteArrayToFile(file, documentContentByteArray);
byte[]documentContentByteArray=IOUtils.toByteArray(inputStream);
可选扩展名=FileTypeHelper.detectFileExtension(inputStream);
if(扩展名.isPresent()){
fileName=文件名+扩展名.get();
}否则{
warn(“文件:{}没有有效的扩展名”,文件名);
}
File File=新文件(“/tmp/”+文件名);
writeByteArrayFile(文件,documentContentByteArray);
它创建了一个文件,但该文件已损坏。我猜在detectFileExtension中使用流之后,流没有正确重置。如果之前有人这样做过,请提供一些指导,提前谢谢。我通过不反复使用相同的输入流来修复它。 我创建了一个用于扩展检测的新流和用于创建文件的初始流
byte[] documentContentByteArray = IOUtils.toByteArray(inputStream);
//extension detection
InputStream extensionDetectionInputStream = new ByteArrayInputStream(documentContentByteArray);
Optional<String> extension = FileTypeHelper.detectFileExtension(inputStream);
if (extension.isPresent()) {
fileName = fileName + extension.get();
} else {
log.warn("File: {} does not have a valid extension", fileName);
}
extensionDetectionInputStream.close();
//File creation
File file = new File("/tmp/" + fileName);
FileUtils.writeByteArrayToFile(file, documentContentByteArray);
byte[]documentContentByteArray=IOUtils.toByteArray(inputStream);
//扩展检测
InputStream extensionDetectionInputStream=新建ByteArrayInputStream(documentContentByteArray);
可选扩展名=FileTypeHelper.detectFileExtension(inputStream);
if(扩展名.isPresent()){
fileName=文件名+扩展名.get();
}否则{
warn(“文件:{}没有有效的扩展名”,文件名);
}
extensionDetectionInputStream.close();
//文件创建
File File=新文件(“/tmp/”+文件名);
writeByteArrayFile(文件,documentContentByteArray);
如果有更好的方法通过重用同一个流来实现这一点,那就太好了,我很乐意接受这个答案,现在,我将此标记为已接受的答案。将Tika流作为
TikaInputStream
传递,然后自己再使用该流?