【问题标题】:Uploading to google cloud storage with Node.js使用 Node.js 上传到谷歌云存储
【发布时间】:2018-09-18 01:12:54
【问题描述】:

在 Node.js 和 Google 云上苦苦挣扎。我正在尝试将文件上传到 Google Cloud Storage 中的存储桶。基本上我在这个答案中使用代码:https://stackoverflow.com/a/45253054/324691,但我无法让它工作。这是我的代码:

const Storage = require('@google-cloud/storage');
const storage = new Storage();
var form = new formidable.IncomingForm();

// form.maxFieldsSize = 20 * 1024 * 1024; // default
form.maxFieldsSize = 20 * 1024;
// form.maxFileSize = 200 * 1024 * 1024;
// 4 MB / minute, 1 hour
form.maxFileSize = 4 * 60 * 1024 * 1024;
// Limit to 10 minutes during tests (4 MB/minute)
form.maxFileSize = 2 * 1024 * 1024;
form.maxFileSize = 4 * 10 * 1024 * 1024;

form.encoding = 'utf-8';
form.keepExtensions = true;
form.type = 'multipart';

return new Promise((resolve, reject) => {
    form.parse(req, (err, fields, files) => {
        console.warn("form.parse callback", err, fields, files);
        if (err) {
            reject(new Error(err));
            return;
        }
        var file = files.upload;
        if(!file){
            reject(new Error("no file to upload, please choose a file."));
            return;
        }
        console.info("about to upload file as a json: " + file.type);
        var filePath = file.path;
        console.log('File path: ' + filePath);
        console.log('File name: ' + file.name);

        var bucket = storage.bucket(bucketName)
        console.info("typeof bucket.upload", typeof bucket.upload);
        bucket.upload(filePath, {
            destination: file.name
        }).then(() => {
            resolve(true);  // Whole thing completed successfully.
            return true;
        }).catch((err) => {
            console.warn("catch bucket.upload, err", err);
            reject(new Error('Failed to upload: ' + JSON.stringify(err)));
        });
        console.warn("After bucket.upload");
    });
    console.warn("After form.parse");
}).then(() => {
    console.warn("form.parse then");
    res.status(200).send('Yay!');
    return true;
}).catch(err => {
    console.warn("form.parse catch");
    console.error('Error while parsing form: ' + err);
    res.status(500).send('Error while parsing form: ' + err);
});

控制台日志中的输出看起来不错(包括 file.path 和 file.name),但是当它到达 bucket.upload(类型为 function)时,它会崩溃并出现错误 Error while parsing form: Error: Failed to upload: {"message":"Error during request."}。然后它说Execution took 1910 ms, user function completed successfully。在那之后终于Function worker killed by signal: SIGTERM

我一直在使用 bucketName 进行测试,无论是否使用“gs://”。

我一直在测试不同的授权方式:

const storage = new Storage({ projectId: projectId });
const storage = new Storage({ keyFileName: 'path-to-keyfile.json'});
const storage = new Storage();

密钥文件是服务帐户的密钥文件(请参阅https://cloud.google.com/docs/authentication/getting-started)。

这是一个 Firebase 项目,我正在本地 Firebase 服务器 (firebase serve --only functions,hosting) 上进行测试。

这里有什么问题?

【问题讨论】:

    标签: node.js firebase authorization google-cloud-storage


    【解决方案1】:

    存储的身份验证应该如下所示:

    const storage = new Storage({
        apiKey: "YOUR_API_KEY",
        authDomain: "YOUR_AUTH_DOMAIN",
        databaseURL: "YOUR_DATABASE_URL",
        projectId: "YOUR_PROJECT_ID",
        storageBucket: "YOUR_STORAGE_BUCKET",
        messagingSenderId: "YOUR_MESSAGE_SENDER_ID"
    });
    

    使用 multipart 看起来也不同于使用本地文件。所以上传的代码是:

                const fileName = 'file_name.extension";
    
                const fileUpload = bucket.file(fileName);
    
                const uploadStream = fileUpload.createWriteStream({
                    metadata: {
                        contentType: file.mimetype
                    }
                });
    
    
                uploadStream.on('error', (err) => {
                    console.log(err);
                    return;
                });
    
                uploadStream.on('finish', () => {
                    console.log('Upload success');
                });
    
                uploadStream.end(file.buffer);
    

    最后,bucketName 不应包含 gs:// - 它应如下所示:project_id.appspot.com

    附言。上传 mimetype 由上面代码中的 busboy 处理。

    【讨论】:

    • 感谢 Gertriax。我认为多部分部分没问题,因为我将它用于正常文件上传。 (也许我应该检查一下拼写错误……)你怎么知道授权应该是这样的?
    • 又是什么授权?
    • 我知道授权,因为我自己使用的是 Firebase 和云服务。所以我也在努力完成这项工作,而且我确实做到了。这是 Github,其代码正在运行 github.com/Getriax/toplance。此授权来自 firebase 站点 firebase.google.com/docs/web/setup?authuser=0。但是,我认为 json 文件也应该可以工作,但我给了你一个对我有用的例子。
    • 代码的工作方式与 2 周前编写的一样 :) 我还发现 Google 文档不是最新的,尤其是 firebase 部分。但是,没想到上传文件不需要授权。无论如何,很高兴我能帮上忙 :-)
    • 根据谷歌云文档,如果您在客户端构建期间未指定凭据,它将在您的环境中查找它们。 github.com/GoogleCloudPlatform/nodejs-docs-samples/blob/master/…。所以我想你是对的:-) 还有google的命令行cloud.google.com/sdk,但我不确定你提到的任务是否有命令。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-22
    • 1970-01-01
    • 2017-04-12
    • 2021-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多