【问题标题】:GCP signed url set content disposition to inlineGCP 签名的 url 将内容处置设置为内联
【发布时间】: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


【解决方案1】:

所以,

我一直在阅读和摆弄文档中的代码,直到我弄明白为止。

我读得越多,所有的阅读和研究就越有意义。

所以如果以后有人遇到同样的问题,我最后用来更改响应头的代码是:

val storage = this.getStorageDefaultInstance()

val blobInfo = BlobInfo.newBuilder(BlobId.of(configuracion.bucket, fileName)).build()

//The query params
val queryParams: MutableMap<String, String> = HashMap()
queryParams["response-content-disposition"] = "inline"
queryParams["response-content-type"] = "application/pdf"

val signUrl = storage.signUrl(blobInfo, expiration, TimeUnit.MILLISECONDS, 
Storage.SignUrlOption.withQueryParams(queryParams), //This is the magic line
Storage.SignUrlOption.withV4Signature())

return signUrl.toString()

为了更清楚,当我阅读其他帖子和文档时,关于将参数(response-content-dispositionresponse-content-type ),我尝试了几种方法,在某处我阅读的评论 response-content-disposition 单独是不够的,这对我来说就是这种情况,我还需要添加 response-content -type 也是,但我的主要错误是在 url 签名后附加这些。

在对 url 签名之前,您需要创建 url 并将参数附加到查询字符串(上面的示例代码),并且 google api 将返回签名的 url,包括附加在查询字符串中的两个参数以及指定的值,所以后面不需要修改url,就可以使用了。

希望这可以帮助其他人节省时间。

【讨论】:

    【解决方案2】:

    这是我运行的代码,它会生成 pdf 的签名 url,然后在浏览器中呈现,如果这不适合你,我会查看 pdf 或浏览器设置。

    String projectId  = "<project_name>";
    String bucketName = "<bucket_name>";
    String objectName = "<file_name>";
    
    Storage strg = StorageOptions.newBuilder().setProjectId(projectId).build().getService();
    BlobInfo blobinfo = BlobInfo.newBuilder(BlobId.of(bucketName, objectName)).build();
    FileInputStream key = new FileInputStream("<path_to_json>");
    
    URL url = strg.signUrl(blobinfo, 
      1, TimeUnit.MINUTES, Storage.SignUrlOption.withV4Signature(),
      SignUrlOption.signWith(ServiceAccountCredentials.fromStream(key))
    );
    
    System.out.println("Signed URL:");
    System.out.println(url);
    

    【讨论】:

    • 问题是,当我通过 PHP 请求相同的文件时,它会在浏览器中打开,没问题。当我在 java 上执行此操作时,它会下载,我注意到标题内容类型不同,我将在问题上添加一个编辑。
    猜你喜欢
    • 2019-09-08
    • 1970-01-01
    • 2020-04-28
    • 1970-01-01
    • 2011-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-19
    相关资源
    最近更新 更多