19

この Flex フォームの内容をノードに送信します (理由は聞かないでください)。base64でエンコードされた画像である「写真」と呼ばれるポストパラメータがあります。

写真の内容は送信OKです。問題は、コンテンツをデコードしてファイルに書き込もうとしているときです。

  var fs = require("fs");

  fs.writeFile("arghhhh.jpg", new Buffer(request.body.photo, "base64").toString(), function(err) {});

toString("binary") も試しました。しかし、ノードはすべてのコンテンツをデコードしていないようです。jpg ヘッダー情報のみをデコードし、残りを残すようです。

誰でもこれで私を助けてもらえますか?

ありがとう

4

4 に答える 4

29

完全に削除して.toString()、バッファを直接書き込んでみてください。

于 2012-04-06T00:03:40.963 に答える
12

これは、base64 画像形式を読み取り、デコードしてデータベースに適切な形式で保存する私の完全なソリューションです。

    // Save base64 image to disk
    try
    {
        // Decoding base-64 image
        // Source: http://stackoverflow.com/questions/20267939/nodejs-write-base64-image-file
        function decodeBase64Image(dataString) 
        {
          var matches = dataString.match(/^data:([A-Za-z-+\/]+);base64,(.+)$/);
          var response = {};

          if (matches.length !== 3) 
          {
            return new Error('Invalid input string');
          }

          response.type = matches[1];
          response.data = new Buffer(matches[2], 'base64');

          return response;
        }

        // Regular expression for image type:
        // This regular image extracts the "jpeg" from "image/jpeg"
        var imageTypeRegularExpression      = /\/(.*?)$/;      

        // Generate random string
        var crypto                          = require('crypto');
        var seed                            = crypto.randomBytes(20);
        var uniqueSHA1String                = crypto
                                               .createHash('sha1')
                                                .update(seed)
                                                 .digest('hex');

        var base64Data = 'data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEAZABkAAD/4Q3zaHR0cDovL25zLmFkb2JlLmN...';

        var imageBuffer                      = decodeBase64Image(base64Data);
        var userUploadedFeedMessagesLocation = '../img/upload/feed/';

        var uniqueRandomImageName            = 'image-' + uniqueSHA1String;
        // This variable is actually an array which has 5 values,
        // The [1] value is the real image extension
        var imageTypeDetected                = imageBuffer
                                                .type
                                                 .match(imageTypeRegularExpression);

        var userUploadedImagePath            = userUploadedFeedMessagesLocation + 
                                               uniqueRandomImageName +
                                               '.' + 
                                               imageTypeDetected[1];

        // Save decoded binary image to disk
        try
        {
        require('fs').writeFile(userUploadedImagePath, imageBuffer.data,  
                                function() 
                                {
                                  console.log('DEBUG - feed:message: Saved to disk image attached by user:', userUploadedImagePath);
                                });
        }
        catch(error)
        {
            console.log('ERROR:', error);
        }

    }
    catch(error)
    {
        console.log('ERROR:', error);
    }
于 2014-10-16T06:27:20.687 に答える
2

nodejs 8.11.3new Buffer(string, encoding)では非推奨です。代わりに、これを行う新しい方法はBuffer.from(string, encoding)常に なし.toString()です。詳細については、nodejs docs: Bufferのドキュメントを参照してください。

于 2018-08-06T19:47:02.100 に答える
0

削除する.toString()

ここでは、base64 をバッファーにデコードしますが、これは問題ありませんが、バッファーを文字列に変換します。これは、コード ポイントがバッファのバイトである文字列オブジェクトであることを意味します。

于 2013-10-22T06:33:43.073 に答える