2012-04-05 22 views
13

Tôi đang gửi nội dung của biểu mẫu Flex này (Đừng hỏi tại sao) qua nút. Có một tham số bài được gọi là "ảnh" là một hình ảnh được mã hóa base64.Node.js Base64 Giải mã hình ảnh và ghi vào tập tin

Nội dung của ảnh được gửi qua ok. Vấn đề là khi tôi đang cố gắng giải mã nội dung và viết chúng vào một tập tin.

var fs = require("fs"); 

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

Tôi cũng đã thử toString ("nhị phân"). Nhưng có vẻ như nút không giải mã tất cả nội dung. Có vẻ như nó chỉ giải mã thông tin tiêu đề jpg và để phần còn lại.

Có ai có thể giúp tôi với điều này không?

Cảm ơn

+0

ảnh là gì đây ?? đó là hình ảnh base64 ??? –

Trả lời

21

Thử xóa hoàn toàn .toString() và chỉ ghi bộ đệm trực tiếp.

+0

cậu bé làm tôi cảm thấy siêu ngu ngốc. Nathan, anh là một anh hùng. Cảm ơn bạn. – Mehdi

+1

Niềm vui của tôi - vui vì tôi có thể giúp: D –

0

Di .toString()

Ở đây bạn giải mã base64 để một bộ đệm, đó là tốt, nhưng sau đó bạn chuyển đổi các bộ đệm vào một chuỗi. Điều này có nghĩa rằng nó là một đối tượng chuỗi có các điểm mã là các byte của bộ đệm.

8

đây là giải pháp đầy đủ của tôi mà sẽ đọc bất kỳ định dạng hình ảnh base64, giải mã nó và lưu nó ở dạng thích hợp trong cơ sở dữ liệu:

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

Hectic: D Làm việc tốt – James111

+0

Đây là phản hồi tôi đang tìm kiếm, cảm ơn m8 – Joniras