5

現在、Google Cloud Storageバケットに直接ファイルをアップロードするために@google-cloud/storage NPMパッケージを使用しています。これは、画像のbase64でエンコードされた文字列しか持たないので、いくつかのトリッキーが必要です。私がしなければならない: Node.jsを使用してBase64でエンコードされた画像(文字列)をGoogle Cloud Storageバケットに直接アップロードするにはどうすればよいですか?

  • は、ローカルファイルを削除してGoogleクラウドストレージにアップロードするには、以下のスクリプトにファイルパスを送るファイルとして保存

    • デコード文字列

    Google App Engineを使用しているので、ファイルシステムにファイルを保存しないようにしたいのですが、何らかの理由で削除操作が機能しない場合は、ファイルシステムを過負荷にするか、迷惑ファイルを残したくありません。これは私のアップロードのスクリプトは、今のように見えるものです:

    // 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'); 
    }); 
    

    はなく、直接ファイルに変換して、パスを使用してアップロードすることの画像のbase64でエンコードされた文字列をアップロードするとにかくはありますか?

  • +0

    'bucket.upload'は'ファイルをラップします。createWriteStream'関数を使用しているので、base64ファイルの文字列を 'file'のそのメソッドで作成されたストリームにパイプする必要があります。私はちょうどファイルシステムに書いて、アップロード後にリンクを解除することをお勧めします。私はあなたがファイルを削除することに問題があるとは思わない。もしあなたがそうするなら、私は例を引き出すことができるかもしれません。 – forrestmid

    +0

    @forrestmid直接アップロードするために 'file.createWriteStream'をどのように実装するのか、本当に感謝します。ありがとう! – Nag

    答えて

    13

    解決策は、Google Cloud Node SDKにbucket.upload関数がラップする機能を使用することです。

    ストリームでの経験はほとんどありません。これがうまく動作しない場合は、私と一緒にお試しください。

    まず、base64データを取得してストリームにドロップする必要があります。そのためには、streamライブラリを組み込み、base64データからバッファを作成し、バッファをストリームの最後に追加します。 decoding base64creating the stream

    var stream = require('stream'); 
    var bufferStream = new stream.PassThrough(); 
    bufferStream.end(new Buffer(req.body.base64Image, 'base64')); 
    

    より。

    次に、ストリームをfile.createWriteStream関数で作成された書き込みストリームにパイプします。 file.createWriteStreamFile docsbucket.upload、およびbucket.upload method code in the Node SDK

    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. 
        }); 
    

    情報。

    上記のコードの仕組みは、ファイルを格納するバケットを定義し、ファイルとファイル名を定義することです。アップロードオプションはここでは設定しません。今作成した変数bufferStreamを前述のfile.createWriteStreamメソッドにパイプします。これらのオプションでは、実装したいメタデータとその他のオプションを定義します。 Node code on Githubを直接見て、彼らがbucket.upload関数をどのように分解しているかを理解することは非常に役に立ちました。最後に、アップロードが完了したときとエラーが発生したときの2つのイベントを添付します。

    +0

    これを投稿していただきありがとうございます!私は実際に似たようなことをしましたが、私は[file.save()](https://googlecloudplatform.github.io/google-cloud-node/#/docs/storage/0.8.0/storage/file?method= save)APIで、 'createWriteStream'のラップアラウンドです。 – Nag

    +1

    @Nagそれは間違いなく動作します!私はそのAPIを読んだが、それがあなたが探していたものと一致する操作であることに気付かなかった。あなたはそれを把握することができてうれしいです。 – forrestmid

    +0

    @Nagあなたはそれをどうやって正確に管理しましたか?あなたが見てみることができるソースコードがありますか?私はこれでたくさん苦労しています。 firebaseクラウドファンクションからBase64でエンコードされたイメージ文字列をFirebase Storageにアップロードしようとしています – 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'); 
    }); 
    

    は、これは私のためにうまく働きました。最初の数行で追加ロジックの一部を無視します。これは、ビルドしているアプリケーションにのみ関連しているためです。

    関連する問題