我正在使用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的结果相同。快把我逼疯了,请帮帮我!
1条答案
按热度按时间nbysray51#
结果发现,使用
Tika
会导致InputStream
标记出错,所以一旦我运行detect
,我就不能重复使用InputStream
上传了。因此,我将
InputStream
转换为byte[]
,然后我可以使用它来检测类型以及保存