当前位置: 首页 > 知识库问答 >
问题:

谷歌云存储创建行为不一致的内容链接

赵景曜
2023-03-14

我正在做一个使用谷歌云存储的项目,允许用户使用Node.js将媒体文件上传到预定义的桶中。我一直在用小的.jpg文件进行测试。我还使用gsutil将bucket权限设置为public。

起初,所有文件都生成下载该文件的链接。通过对文档的研究,我了解到可以在上传后使用gsutilCLI显式设置每个文件的content-type。当我使用此过程将文件类型设置为'image/jpeg'时,链接行为更改为在浏览器中显示图像。但是,只有在使用gsutil更新元数据之前没有单击该链接时,这种方法才会起作用。我认为这可能是由于浏览器缓存造成的,但这种行为在一个隐姓埋名的浏览器中被复制了。

使用gsutil设置mime类型无论如何都是不切实际的,因此我修改了节点服务器post函数中的代码,以便在上传时使用名为mimeNPM模块设置元数据。代码如下:

app.post('/api/assets', multer.single('qqfile'), function (req, res, next) {
    console.log(req.file);

    if (!req.file) {
        return ('400 - No file uploaded.');
    }

    // Create a new blob in the bucket and upload the file data.
    var blob = bucket.file(req.file.originalname);
    var blobStream = blob.createWriteStream();
    var metadata = {
        contentType: mime.lookup(req.file.originalname)
    };

    blobStream.on('error', function (err) {
        return next(err);
    });

    blobStream.on('finish', function () {

        blob.setMetadata(metadata, function(err, response){
            console.log(response);
             // The public URL can be used to directly access the file via HTTP.
        var publicUrl = format(
        'https://storage.googleapis.com/%s/%s',
        bucket.name, blob.name);
        res.status(200).send(
            {
                'success': true,
                'publicUrl': publicUrl,
                'mediaLink': response.mediaLink
            });
        });

    });

    blobStream.end(req.file.buffer);

});

我在这里漏掉了什么?

共有1个答案

张嘉熙
2023-03-14

现在,您的浏览器可能下载图像而不是显示它们的原因有两个。首先,如果Content-Type设置为“Application/Octet-Stream”,大多数浏览器会将结果下载为文件,而不是显示它们。这很可能发生在你的案子上。

第二个原因是如果服务器使用“Content-Disposition:Attachment”标头进行响应。当您像上面所做的那样从主机“storage.googleapis.com”中获取GCS对象时,通常不会发生这种情况,但如果您显式地为上传的对象指定了contentDisposition就会发生这种情况。

出于这个原因,我怀疑您的一些对象没有“image/jpeg”内容类型。您可以使用gsutil进行设置,如下所示:gsutil-m setmeta'content-type:image/jpeg'gs://mybucketname/**

 类似资料:
  • 当使用带有base64数据的PUT请求上传到Google cloud storage时,图像(PNG)不会在浏览器中显示,并表示它包含错误(在FF中查看时)。 根据我在网上读到的东西,我觉得这是可能的,但我找不到任何例子来说明它是如何用PUT来完成的,以表明它工作时缺少什么。

  • 我正在尝试使用Google云存储API,该API现已发布在App Engine网站的文档部分。文档指出,您必须将appengine服务帐户添加为API控制台中的团队成员。然而,我们在谷歌应用程序域中使用云存储,这只允许该域的用户作为团队成员添加。那么,不可能添加服务帐户(@appspot.gserviceaccount.com)吗?。有什么变通办法吗?

  • 我有一个具有统一访问控制的Google云存储桶,我在权限中添加了“诱惑者”。它说该对象是公共的,但当我尝试打开链接时,仍会收到此消息:“匿名调用方没有storage.objects.get access to the Google Cloud storage object”错误代码为“401”。我希望任何用户都能够访问该链接。我该怎么做?提前谢谢! 向你问好本

  • 我建立Android应用程序链接到谷歌云存储。我想允许访问GCS到我的Android应用程序只。 谷歌提供三种安全连接地面军事系统的解决方案: Oauth 2.0(谷歌账户也是如此) 资料来源:https://developers.google.com/storage/docs/authentication?hl=FR 是否有其他通过地面军事系统安全连接的解决方案?我希望通过这种方式在地面军事系统

  • 我们一直在使用服务,在(AWS)中,我们意外删除了一个目录,因此我们认为它应该在中,但是经过查看,尽管处于打开状态,但它并不存在。

  • 我知道可以使用谷歌API视觉在网上找到类似的图片。我的目标是根据我的图像数据库找到类似的图像。我不想在网上看到类似的图片。 可能吗? 如果是,你能给我一些链接或建议吗? 谢谢