如何通过HTTP Google Cloud Function上传图像文件?

2024-04-18

我已阅读有关如何将图像上传到存储桶并通过后台功能进行后期处理的教程。但我的要求是上传图像,进行后处理并立即通过HTTP函数返回结果。请让我知道这是否是正确的方法,因为我在网上没有得到太多关于这方面的材料。以下是我的做法:

HTTP云功能:

exports.uploadImage = function (req, res){
 var file = req.body.file;
 uploadSomewhere(file)(); < post-processing code which is working fine >

UI form:

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7/jquery.js"></script> 
<script src="http://malsup.github.com/jquery.form.js"></script>
<form id="myForm" action="<cloud_function_url>/uploadImage" method="post"> 
  <label for="file">Choose file to upload</label>
  <input type="file" id="file" name="file" multiple>
  <input type="submit" value="Submit" /> 
</form>

<script> 
 $(document).ready(function() { 
  $('#myForm').ajaxForm(function() { 
 }); 
}); 
</script>

问题是,在我部署该功能后,当我从该功能所在的文件夹上传图像时,图像就会上传。但如果我从任何其他位置上传图像,它会返回错误:

错误:上传图像文件时出错.... - 错误:ENOENT:没有这样的文件或目录,打开“....”

请让我知道我做错了什么或者您是否需要更多信息。


这是一个完整的工作函数文件

    const vision = require('@google-cloud/vision')({
        projectId: "pid",
        keyfileName: 'keyfile.json'
    });


    // The Cloud Functions for Firebase SDK to create Cloud Functions and setup triggers.
    const functions = require('firebase-functions');

    // The Firebase Admin SDK to access the Firebase Realtime Database.
    const admin = require('firebase-admin');
    admin.initializeApp();
    // Create the Firebase reference to store our image data
    const db = admin.database();
    const { Storage } = require('@google-cloud/storage');
    // Your Google Cloud Platform project ID                                        
    const projectId = 'pid';

    // Creates a client                                                             
    const storage = new Storage({
        projectId: projectId,
    });
    /**
     * Parses a 'multipart/form-data' upload request
     *
     * @param {Object} req Cloud Function request context.
     * @param {Object} res Cloud Function response context.
     */
    const path = require('path');
    const os = require('os');
    const fs = require('fs');

    // Node.js doesn't have a built-in multipart/form-data parsing library.
    // Instead, we can use the 'busboy' library from NPM to parse these requests.
    const Busboy = require('busboy');

    exports.upload = functions.https.onRequest((req, res) => {
        if (req.method !== 'POST') {
            // Return a "method not allowed" error
            return res.status(405).end();
        }
        const busboy = new Busboy({ headers: req.headers });
        const tmpdir = os.tmpdir();

        // This object will accumulate all the fields, keyed by their name
        const fields = {};

        // This object will accumulate all the uploaded files, keyed by their name.
        const uploads = {};

        // This code will process each non-file field in the form.
        busboy.on('field', (fieldname, val) => {
            // TODO(developer): Process submitted field values here
            console.log(`Processed field ${fieldname}: ${val}.`);
            fields[fieldname] = val;
        });

        const fileWrites = [];

        // This code will process each file uploaded.
        busboy.on('file', (fieldname, file, filename) => {
            // Note: os.tmpdir() points to an in-memory file system on GCF
            // Thus, any files in it must fit in the instance's memory.
            console.log(`Processed file ${filename}`);

            const filepath = path.join(tmpdir, filename);
            uploads[fieldname] = filepath;

            const writeStream = fs.createWriteStream(filepath);
            file.pipe(writeStream);

            // File was processed by Busboy; wait for it to be written to disk.
            const promise = new Promise((resolve, reject) => {
                file.on('end', () => {
                    writeStream.end();
                });
                writeStream.on('finish', resolve);
                writeStream.on('error', reject);
            });
            fileWrites.push(promise);
        });

        // Triggered once all uploaded files are processed by Busboy.
        // We still need to wait for the disk writes (saves) to complete.
        busboy.on('finish', () => {
            Promise.all(fileWrites).then(() => {
                // TODO(developer): Process saved files here
                for (const name in uploads) {
                    const file = uploads[name];
                    async function upload2bucket() {
                        var bucketName = 'bname'
                        fileRes = await storage.bucket(bucketName).upload(file);
                        fs.unlinkSync(file);
                        console.log('fileRes',fileRes)
                        console.log(`Finish: Processed file ${file}`);
                        res.send(fileRes);
                    }
                    upload2bucket()
                }
            });
        });

        busboy.end(req.rawBody);

    });
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何通过HTTP Google Cloud Function上传图像文件? 的相关文章

随机推荐