2012-04-05 29 views
13

Wysyłam zawartość tego formularza Flex (Nie pytaj dlaczego) do węzła. Istnieje postparametr zwany "zdjęciem", który jest obrazem zakodowanym w base64.Node.js Base64 Dekodowanie obrazu i zapisywanie do pliku

Treść zdjęcia zostanie wysłana ponad. Problem polega na tym, że próbuję odkodować zawartość i zapisać ją w pliku.

var fs = require("fs"); 

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

Próbowałem toString ("binarny"), jak również. Ale wygląda na to, że węzeł nie dekoduje całej zawartości. Wydaje się, że tylko dekoduje informacje nagłówka jpg i pozostawia resztę.

Czy ktoś może mi w tym pomóc?

Dzięki

+0

Co jest zdjęcie tutaj ?? czy to obraz bazowy64? –

Odpowiedz

21

Spróbuj usunąć .toString() całkowicie i po prostu zapisać bufor bezpośrednio.

+0

chłopak, czuję się bardzo głupio. Nathan, jesteś bohaterem. Dziękuję Ci. – Mehdi

+1

Moja przyjemność - cieszę się, że mogę pomóc: D –

0

Usuń .toString()

Tutaj dekodowania base64 do bufora, co jest w porządku, ale potem można przekonwertować bufor na sznurku. Oznacza to, że jest to obiekt typu string, którego punkty kodowe są bajtami bufora.

8

to moje pełne rozwiązanie, które czytać base64 format obrazu, dekodowania i zapisać go w odpowiednim formacie w bazie:

// 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 Dobra robota – James111

+0

To była odpowiedź, której szukałem, dziękuje m8 – Joniras