2015-05-30 6 views
0

Я отправляю изображение в виде буфера обмена base64 на сервер (узел), и я сохраняю base64 на диск. По какой-то причине изображение повреждено.base64 закодированное изображение повреждено при сохранении на диске

стороне клиента логика размещения:

function sendData($http, clipboardImage) { 
    // $http.defaults.headers.post["Content-Type"] = "application/x-www-form-urlencoded"; 
    // var imgData = JSON.stringify(clipboardImage); 
    //var data = {"imgdata" : clipboardImage}; 
    var url = "http://localhost:3000/pad/img/"; 

    $http({ 
     method: 'POST', 
     url: url, 
     data: "data=" + clipboardImage 
    }); 
} 

$("[ng-model='html']").delegate("p", "paste", function(event) { 
    var items = (event.clipboardData || event.originalEvent.clipboardData).items; 
    console.log(JSON.stringify(items)); // will give you the mime types 
    // find pasted image among pasted items 
    var blob = null; 
    for (var i = 0; i < items.length; i++) { 
     if (items[i].type.indexOf("image") === 0) { 
      blob = items[i].getAsFile(); 
     } 
    } 
    // load image if there is a pasted image 
    if (blob !== null) { 
     var reader = new FileReader(); 
     reader.onload = function(e) { 
      sendData($http, e.target.result); 
     }; 
     reader.readAsDataURL(blob); 
    } 
}); 

логика сервера:

app.post("/pad/img/", function(req, res) { 
    var imgB64Data = req.body.data; 
    var decodedImg = decodeBase64Image(imgB64Data); 
    var imageBuffer = decodedImg.data; 
    var type = decodedImg.type; 
    var extension = mime.extension(type); 
    var fileName = "image." + extension; 
    try { 
     fs.writeFile(fileName, imageBuffer, function(err) { 
      console.log(err); 
     }); 
    } catch (err) { 
     console.error(err); 
    } 
}); 

function decodeBase64Image(dataString) { 
    var matches = dataString.match(/^data:([A-Za-z-+\/]+);base64,(.+)$/), 
     response = {}; 

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

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

    return response; 
} 

Изображение спасаемых успешно, но это, кажется, поврежден. Не могли бы вы указать, что может отсутствовать?

+0

Вы проверили в кодировке Base64 ('матчи [2]') перед включением его в буфер? Я не уверен, какой тип base64 'readAsDataURL' вернется, вам может понадобиться сначала« url encode »на стороне клиента. Если это вариант сохранения URL-адресов, вам может потребоваться его конвертировать на сервер. –

+0

Я предполагаю, что это была проблема с отправкой данных. $ http ({ метод: 'POST', url: url, данные: {данные: clipboardImage} }); –

ответ

0

Вы пытались явно установить кодировку файла при вызове fs.writeFile?

try { 
    fs.writeFile(fileName, imageBuffer, {encoding:'utf8'}, function(err) { 
     console.log(err); 
    }); 
} catch (err) { 
    console.error(err); 
} 

NodeJS Docs: fs.writeFile(filename, data\[, options\], callback)

+0

Я думаю, что это связано с тем, как я отправляю данные. Я отправил его как строку изначально. Я изменил объект и его работу сейчас. –

Смежные вопросы