【发布时间】:2023-03-03 05:29:20
【问题描述】:
在问这个问题之前,我做了很多研究和测试,像往常一样,我不喜欢仅仅因为问。
我无法使用在浏览器中显示文件 (content-disposition:inline) 的 java 创建签名 url。
当我使用 PHP sdk 执行此操作时,我没有遇到任何问题,我将签名的 url 复制并粘贴到浏览器中,文件显示在浏览器中。但是当对同一个文件使用java时,文件是下载的。
在这个post中,它提到了一些关于清除元数据并将“&response-content-disposition=inline”附加到签名的url,它也在google cloud docs中提到。
我尝试了多种方法,但我无法使其正常工作,当我按照docs 中的指定附加 "&response-content-disposition=inline" 时,我得到了以下错误:
<Code>SignatureDoesNotMatch</Code>
<Message> The request signature we
calculated does not match the signature you provided. Check your
Google secret key and signing method. </Message>
但它说那些参数不包括在签名的计算中,所以我不知道发生了什么。
在我尝试过的代码中:
(transformed to kotlin)
val blobInfo = BlobInfo.newBuilder(BlobId.of(configuracion.bucket, fileName)).build()
val newMetadata: MutableMap<String, String> = HashMap()
newMetadata["contentDisposition"] = "inline"
blobInfo.toBuilder().setMetadata(newMetadata).build()
val signUrl = storage.signUrl(blobInfo, expiration, TimeUnit.MILLISECONDS,Storage.SignUrlOption.withV4Signature())
return signUrl.toString()
但没有运气。
我认为应该有一种非常直接的方式来将内容配置设置为我想要的任何内容,但似乎并非如此。
我生成签名网址的方式很简单:
val storage = this.getStorageDefaultInstance()
val blobInfo = BlobInfo.newBuilder(BlobId.of(configuracion.bucket, fileName)).build()
val signUrl = storage.signUrl(blobInfo, expiration, TimeUnit.MILLISECONDS, Storage.SignUrlOption.withV4Signature())
return signUrl.toString()
有什么建议吗?
编辑
我注意到,当我使用 PHP SDK 请求文件时,我得到响应头 "content-type: application/pdf",而在 Java 上我得到 "content-type: application /octet-stream",也许这就是我需要改变的地方。
我尝试使用以下方法覆盖元数据:
val newMetadata: MutableMap<String, String> = HashMap()
newMetadata["contentDisposition"] = "inline"
newMetadata["contentType"] = "application%2Fpdf"
val blobInfo = BlobInfo.newBuilder(BlobId.of(configuracion.bucket, fileName)).setMetadata(newMetadata).build()
仍然没有运气。
【问题讨论】:
-
只是出于好奇,什么样的文件?我正在尝试使用图像进行复制,并且我的浏览器可以从使用 java 代码生成的签名 url 中很好地呈现此图像
-
这是一个pdf @jabbson
-
试过 pdf,仍然在浏览器中呈现
标签: java kotlin google-cloud-platform google-cloud-storage