java 仅当使用Tika获取Content-Type时,将文件上传到Google Cloud Storage才会损坏

ldxq2e6h  于 2023-04-28  发布在  Java
关注(0)|答案(1)|浏览(189)

我正在使用Google Cloud Storage Java SDK(V.2.20.1)将文件上传到我的Bucket。我正在尝试设置文件的Content-Type,我使用ApacheTika来检测它。问题是,如果使用Tika返回的Content-Type,即使它是正确的,当文件上传时,它已损坏,我无法查看它。如果我手动设置Content-Type,与Tika返回的值相同,那么它会上传,我可以查看文件而不会出现问题。
此代码不工作,我验证内容类型是否完全匹配applicaiton/pdf,但上传时已损坏,无法查看。

Tika tika = new Tika();
String contentType = tika.detect(inputStream);
System.out.println(contentType); //"application/pdf"

if("application/pdf".equals(contentType)) {
     return bucket.create(Utilities.formatDirectoryName(directory) + name, inputStream, contentType);
} else {
     System.out.println("INVALID TYPE");
     return null;
}

此代码通过手动设置Content-Type来工作。文件上传,我可以查看它没有问题。

String contentType = "application/pdf";
System.out.println(contentType); //"application/pdf"
if("application/pdf".equals(contentType)) {
     return bucket.create(Utilities.formatDirectoryName(directory) + name, inputStream, contentType);
} else {
     System.out.println("INVALID TYPE");
     return null;
}

当我查看Cloud Storage UI上的信息时,上面列出的两种方法都显示正确。内容-类型、大小等不同的是,当我下载文件查看时,一个不工作(损坏),另一个工作(正确查看)。

我已经多次运行此测试,以确保它不只是一个奇怪的上传故障,但它的一致性,每一次。我也尝试过不同类型的文件,如Power Points。使用Tika与手动设置Content-Type的结果相同。快把我逼疯了,请帮帮我!

nbysray5

nbysray51#

结果发现,使用Tika会导致InputStream标记出错,所以一旦我运行detect,我就不能重复使用InputStream上传了。
因此,我将InputStream转换为byte[],然后我可以使用它来检测类型以及保存

ByteArrayOutputStream baos = new ByteArrayOutputStream();
inputStream.transferTo(baos);
            
byte[] byteData = baos.toByteArray();
Tika tika = new Tika();
tika.detect(byteData);

相关问题