javascript - ফায়ারবাসের জন্য ক্লাউড ফাংশনগুলিতে এক্সপ্রেস ব্যবহার করে কীভাবে এইচটিটিপি ফাইল আপলোড করবেন(মাল্টার, বাসবয়)




firebase express (5)

অফিসিয়াল ক্লাউড ফাংশন টিমের উত্তর যুক্ত করতে, আপনি স্থানীয়ভাবে নিম্নলিখিতগুলি অনুসরণ করে এই আচরণটি অনুকরণ করতে পারেন (তারা পোস্ট করা বাসবয় কোডের চেয়ে এই মিডলওয়্যারটি উচ্চতর যুক্ত করুন)

const getRawBody = require('raw-body');
const contentType = require('content-type');

app.use(function(req, res, next){
    if(req.rawBody === undefined && req.method === 'POST' && req.headers['content-type'] !== undefined && req.headers['content-type'].startsWith('multipart/form-data')){
        getRawBody(req, {
            length: req.headers['content-length'],
            limit: '10mb',
            encoding: contentType.parse(req).parameters.charset
        }, function(err, string){
            if (err) return next(err);
            req.rawBody = string;
            next();
        });
    }
    else{
        next();
    }
});

আমি অনুরোধগুলি হ্যান্ডেল করতে এক্সপ্রেস ব্যবহার করে ক্লাউড ফাংশনগুলিতে একটি ফাইল আপলোড করার চেষ্টা করছি, তবে আমি সফল হচ্ছি না। আমি একটি সংস্করণ তৈরি করেছি যা স্থানীয়ভাবে কাজ করে:

সার্ভারসাইড জেএস

const express = require('express');
const cors = require('cors');
const fileUpload = require('express-fileupload');

const app = express();
app.use(fileUpload());
app.use(cors());

app.post('/upload', (req, res) => {
    res.send('files: ' + Object.keys(req.files).join(', '));
});

ক্লায়েন্টাইড জেএস

const formData = new FormData();
Array.from(this.$refs.fileSelect.files).forEach((file, index) => {
    formData.append('sample' + index, file, 'sample');
});

axios.post(
    url,
    formData, 
    {
        headers: { 'Content-Type': 'multipart/form-data' },
    }
);

ক্লাউড ফাংশনগুলিতে স্থাপন করার সময় এই একই একই কোডটি ভেঙে গেছে বলে মনে হচ্ছে যেখানে req.files অপরিজ্ঞাত। এখানে কি ঘটছে কারও কি ধারণা আছে?

সম্পাদনা করুন আমিও multer ব্যবহার করতে multer , যা স্থানীয়ভাবে ভাল কাজ করেছিল, কিন্তু ক্লাউড ফাংশনে একবার আপলোড করার পরে এটি আমাকে একটি খালি অ্যারে (একই ক্লায়েন্টের কোড) পেয়েছে:

const app = express();
const upload = multer();
app.use(cors());

app.post('/upload', upload.any(), (req, res) => {
    res.send(JSON.stringify(req.files));
});

আমি কয়েক দিন ধরে একই সমস্যায় ভুগছি, দেখা যাচ্ছে যে ফায়ারবেস টিম তাদের মিডওয়্যারের সাথে মাল্টিপার্ট / ফর্ম-ডেটার কাঁচা দেহকে রেকর্ড করে দিয়েছে। যদি আপনি মাল্টারের সাথে আপনার অনুরোধটি প্রক্রিয়া করার আগে কনসোল.লগ (req.body.toString ()) চেষ্টা করে থাকেন তবে আপনি আপনার ডেটা দেখতে পাবেন। যেহেতু মাল্টার একটি নতুন req.body অবজেক্ট তৈরি করে যা ফলাফলের রেকটিকে ওভাররাইড করে চলেছে, ডেটা চলে গেছে এবং আমরা যে সব পেতে পারি তা একটি খালি রেক.কোডি। আশা করি ফায়ারবেস টিম শীঘ্রই এটিকে সংশোধন করতে পারে।


এই থ্রেডে প্রত্যেকের সহায়তার জন্য ধন্যবাদ। আমি সমস্ত সম্ভাব্য সংমিশ্রণ এবং এই সমস্ত বিভিন্ন গ্রন্থাগার চেষ্টা করে একটি পুরো দিন নষ্ট করেছি ... কেবলমাত্র অন্যান্য সমস্ত বিকল্পগুলি ক্লান্ত করার পরে এটি আবিষ্কার করার জন্য।

এখানে টাইপস্ক্রিপ্ট এবং মিডলওয়্যার সক্ষম স্ক্রিপ্ট তৈরি করার জন্য উপরের সমাধানগুলির কয়েকটি মিশ্রিত করুন:

https://gist.github.com/jasonbyrne/8dcd15701f686a4703a72f13e3f800c0


জি রডরিগজের প্রতিক্রিয়া আমি কিছু বাগ স্থির করেছি। আমি বাসবয়ের জন্য 'ফিল্ড' এবং 'ফিনিশ' ইভেন্টটি যুক্ত করেছি এবং 'ফিনিশ' ইভেন্টে পরবর্তী () করব। এটা আমার জন্য কাজ। অনুসরণ:

    module.exports = (path, app) => {
    app.use(bodyParser.json())
    app.use(bodyParser.urlencoded({ extended: true }))
    app.use((req, res, next) => {
        if(req.rawBody === undefined && req.method === 'POST' && req.headers['content-type'].startsWith('multipart/form-data')){
            getRawBody(req, {
                length: req.headers['content-length'],
                limit: '10mb',
                encoding: contentType.parse(req).parameters.charset
            }, function(err, string){
                if (err) return next(err)
                req.rawBody = string
                next()
            })
        } else {
            next()
        }
    })

    app.use((req, res, next) => {
        if (req.method === 'POST' && req.headers['content-type'].startsWith('multipart/form-data')) {
            const busboy = new Busboy({ headers: req.headers })
            let fileBuffer = new Buffer('')
            req.files = {
                file: []
            }

            busboy.on('file', (fieldname, file, filename, encoding, mimetype) => {
                file.on('data', (data) => {
                    fileBuffer = Buffer.concat([fileBuffer, data])
                })

                file.on('end', () => {
                    const file_object = {
                        fieldname,
                        'originalname': filename,
                        encoding,
                        mimetype,
                        buffer: fileBuffer
                    }

                    req.files.file.push(file_object)
                })
            })

            busboy.on('field', function(fieldname, val, fieldnameTruncated, valTruncated) {
              console.log('Field [' + fieldname + ']: value: ' + inspect(val));
            });

            busboy.on('finish', function() {
              next()
            });

            busboy.end(req.rawBody)
            req.pipe(busboy);
        } else {
            next()
        }
    })}

উপরের উত্তরের জন্য ধন্যবাদ আমি এর জন্য একটি এনপিএম মডিউল তৈরি করেছি ( github )

এটি গুগল ক্লাউড ফাংশনগুলির সাথে কাজ করে, কেবল এটি ইনস্টল করুন ( npm install --save express-multipart-file-parser ) এবং এটি এটি ব্যবহার করুন:

const fileMiddleware = require('express-multipart-file-parser')

...
app.use(fileMiddleware)
...

app.post('/file', (req, res) => {
  const {
    fieldname,
    filename,
    encoding,
    mimetype,
    buffer,
  } = req.files[0]
  ...
})




google-cloud-functions