Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用ApacheTika检测文件扩展名会损坏文件_Java_Apache_Inputstream_Apache Tika - Fatal编程技术网

Java 使用ApacheTika检测文件扩展名会损坏文件

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

我试图检测作为InputStream传递的文件的文件扩展名,该扩展名被正确检测到,但此后文件往往会损坏。以下是我检测扩展的方法-

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
传递,然后自己再使用该流?