5

वर्तमान में, मैं Google क्लाउड स्टोरेज बाल्टी पर सीधे फ़ाइल अपलोड करने के लिए @google-cloud/storage एनपीएम पैकेज का उपयोग कर रहा हूं। इसके लिए कुछ चालबाजी की आवश्यकता है क्योंकि मेरे पास केवल छवि की बेस 64 एन्कोडेड स्ट्रिंग है। मैं करने के लिए है: एक फ़ाइल के रूप में सहेजें स्ट्रिंग मैं Node.js का उपयोग कर सीधे Google क्लाउड स्टोरेज बाल्टी पर बेस 64 एन्कोडेड छवि (स्ट्रिंग) कैसे अपलोड करूं?

    • डिकोड
    • Google क्लाउड संग्रहण में अपलोड करने के लिए
    • स्थानीय फ़ाइल हटाएं नीचे स्क्रिप्ट के लिए फ़ाइल पथ भेजें

    मैं फाइल सिस्टम में फाइल को पूरी तरह से संग्रहीत करना चाहता हूं क्योंकि मैं Google ऐप इंजन का उपयोग कर रहा हूं और अगर फाइल हटाना ऑपरेशन किसी भी कारण से काम नहीं करता है तो मैं फाइल सिस्टम को छोड़ना/जंक फाइलों को छोड़ना नहीं चाहता हूं।

    // Convert the base64 string back to an image to upload into the Google Cloud Storage bucket 
    var base64Img = require('base64-img'); 
    var filePath = base64Img.imgSync(req.body.base64Image, 'user-uploads', 'image-name'); 
    
    // Instantiate the GCP Storage instance 
    var gcs = require('@google-cloud/storage')(), 
        bucket = gcs.bucket('google-cloud-storage-bucket-name'); 
    
    // Upload the image to the bucket 
    bucket.upload(__dirname.slice(0, -15) + filePath, { 
        destination: 'profile-images/576dba00c1346abe12fb502a-original.jpg', 
        public: true, 
        validation: 'md5' 
    }, function(error, file) { 
    
        if (error) { 
         sails.log.error(error); 
        } 
    
        return res.ok('Image uploaded'); 
    }); 
    

    वहाँ वैसे भी है सीधे बेस 64 इनकोडिंग बजाय इसे एक फाइल में कन्वर्ट और फिर पथ का उपयोग कर अपलोड करने के काम की छवि की स्ट्रिंग अपलोड करने के लिए: यह मेरा अपलोड स्क्रिप्ट अभी की तरह लग रहा है?

  • +0

    'bucket.upload' 'फ़ाइल को लपेटता है।createWriteStream' फ़ंक्शन, इसलिए आपको उस फ़ाइल द्वारा बनाई गई स्ट्रीम में 'base' में अपनी बेस 64 फ़ाइल स्ट्रिंग को पाइप करने की आवश्यकता होगी। मैं सिर्फ फाइल सिस्टम को लिखने और अपलोड करने के बाद अनलिंक करने की सलाह दूंगा। मुझे नहीं लगता कि आपको फ़ाइलों को हटाने में समस्या होगी। यदि आप इतने इच्छुक हैं तो मैं एक उदाहरण खींच सकता हूं। – forrestmid

    +0

    @forrestmid वास्तव में एक उदाहरण की सराहना करेगा कि आप सीधे 'file.createWriteStream' को सीधे अपलोड करने के लिए कैसे कार्यान्वित करेंगे। धन्यवाद! – Nag

    उत्तर

    13

    समाधान, मुझे विश्वास है कि file.createWriteStream कार्यक्षमता का उपयोग करना है जो bucket.upload फ़ंक्शन Google Google नोड एसडीके में लपेटता है।

    मुझे धाराओं के साथ बहुत कम अनुभव मिला है, इसलिए अगर यह सही काम नहीं करता है तो मेरे साथ सहन करने का प्रयास करें।

    सबसे पहले, हमें बेस 64 डेटा लेने और इसे स्ट्रीम में छोड़ने की आवश्यकता है। इसके लिए, हम stream लाइब्रेरी को शामिल करने जा रहे हैं, बेस 64 डेटा से बफर बनाएं, और स्ट्रीम के अंत में बफर जोड़ें।

    var stream = require('stream'); 
    var bufferStream = new stream.PassThrough(); 
    bufferStream.end(new Buffer(req.body.base64Image, 'base64')); 
    
    decoding base64 और creating the stream पर

    अधिक।

    हम फिर file.createWriteStream फ़ंक्शन द्वारा बनाई गई एक लेखन स्ट्रीम में स्ट्रीम को पाइप करने जा रहे हैं।

    var gcs = require('@google-cloud/storage')({ 
        projectId: 'grape-spaceship-123', 
        keyFilename: '/path/to/keyfile.json' 
    }); 
    
    //Define bucket. 
    var myBucket = gcs.bucket('my-bucket'); 
    //Define file & file name. 
    var file = myBucket.file('my-file.jpg'); 
    //Pipe the 'bufferStream' into a 'file.createWriteStream' method. 
    bufferStream.pipe(file.createWriteStream({ 
        metadata: { 
         contentType: 'image/jpeg', 
         metadata: { 
         custom: 'metadata' 
         } 
        }, 
        public: true, 
        validation: "md5" 
        })) 
        .on('error', function(err) {}) 
        .on('finish', function() { 
        // The file upload is complete. 
        }); 
    

    जानकारी पर file.createWriteStream, File docs, bucket.upload, और bucket.upload method code in the Node SDK

    तो जिस तरह से उपर्युक्त कोड काम करता है वह उस बाल्टी को परिभाषित करना है जिसे आप फ़ाइल में रखना चाहते हैं, फिर फ़ाइल और फ़ाइल नाम को परिभाषित करें। हम यहां अपलोड विकल्प सेट नहीं करते हैं। हम तब bufferStream वैरिएबल पाइप करते हैं जिसे हमने अभी file.createWriteStream विधि में बनाया है जिस पर हमने पहले चर्चा की थी। इन विकल्पों में हम मेटाडेटा और अन्य विकल्पों को परिभाषित करते हैं जिन्हें आप कार्यान्वित करना चाहते हैं। फ़ंक्शन को तोड़ने के तरीके को जानने के लिए Node code on Github पर सीधे देखना बहुत उपयोगी था, और आपको यह भी करने की सलाह देते हैं। अंत में, जब अपलोड समाप्त होता है और जब यह त्रुटियां समाप्त होता है तो हम दो ईवेंट संलग्न करते हैं।

    +0

    इसे पोस्ट करने के लिए धन्यवाद! मैंने वास्तव में कुछ ऐसा ही किया है, मैंने [file.save()] (https://googlecloudplatform.github.io/google-cloud-node/#/docs/storage/0.8.0/storage/file?method= का उपयोग किया था सहेजें) एपीआई जो 'createWriteStream' का एक रैपरराउंड है। – Nag

    +1

    @Nag यह निश्चित रूप से काम करता है! मैंने उस एपीआई के माध्यम से पढ़ा लेकिन ध्यान नहीं दिया कि यह ऑपरेशन उस मिलान से मेल खाता है जिसे आप ढूंढ रहे थे। खुशी है कि आप इसे समझने में सक्षम थे। – forrestmid

    +0

    @Nag आप इसे करने के लिए वास्तव में कैसे प्रबंधित किया? क्या आपके पास सोर्स कोड है जिसे हम देख सकते हैं ?? मैं इसके साथ बहुत संघर्ष कर रहा हूं। मैं फायरबेस क्लाउड फ़ंक्शंस – krlozadan

    1

    ऊपर @krlozadan के अनुरोध के जवाब में उत्तर की मेरी संस्करण पोस्ट करना:

    // Convert the base64 string back to an image to upload into the Google Cloud Storage bucket 
    var mimeTypes = require('mimetypes'); 
    
    var image = req.body.profile.image, 
        mimeType = image.match(/data:([a-zA-Z0-9]+\/[a-zA-Z0-9-.+]+).*,.*/)[1], 
        fileName = req.profile.id + '-original.' + mimeTypes.detectExtension(mimeType), 
        base64EncodedImageString = image.replace(/^data:image\/\w+;base64,/, ''), 
        imageBuffer = new Buffer(base64EncodedImageString, 'base64'); 
    
    // Instantiate the GCP Storage instance 
    var gcs = require('@google-cloud/storage')(), 
        bucket = gcs.bucket('my-bucket'); 
    
    // Upload the image to the bucket 
    var file = bucket.file('profile-images/' + fileName); 
    
    file.save(imageBuffer, { 
        metadata: { contentType: mimeType }, 
        public: true, 
        validation: 'md5' 
    }, function(error) { 
    
        if (error) { 
         return res.serverError('Unable to upload the image.'); 
        } 
    
        return res.ok('Uploaded'); 
    }); 
    

    यह मेरे लिए ठीक काम किया। पहली कुछ पंक्तियों में कुछ अतिरिक्त तर्कों को अनदेखा करें क्योंकि वे केवल उस एप्लिकेशन के लिए प्रासंगिक हैं जो मैं बना रहा हूं।

    संबंधित मुद्दे