Как правильно сохранить загруженный файл?
Только начинаю осваивать Node.JS, так что вопрос соответствующий. Тем не менее, я бьюсь над ним уже 3й день, попутно дорабатывая код.
Есть файл, origin.png - оригинал картинки. Он лежит в директории со скриптом, для упрощений дебага. Пытаюсь его залить и сохранить под другим именем через форму, отправленную в кодировке multipart/form-data. Я не люблю чужой код, поэтому не использую модули кроме тех, что в ядре. Даже парсинг формы. Когда заливаю файл -- непонятно что не так. Содержимое файла origin.png, который я загружал, равно полученным данным. Но полученные данные не равны содержимому файла copy.png, который я создавал из них! Объясните, пожалуйста, как правильно этот файл скачивать/обрабатывать/записывать. А то я уже ничего не понимаю. Файл index.js: var fs = require('fs'); var multipart = require('./form'); require('http').createServer(function go(request, response) { var GET = url.parse(request.url, true).query; var POST = {}; if (request.url == '/post') { var globalData = ''; request.addListener('data', function(chunk) { globalData += chunk; }).addListener('end', function() { POST = request.headers['content-type'].startsWith('multipart') ? multipart(request, globalData) : url.parse(globalData, true).query; fs.writeFile('copy.png', POST.file.content, 'binary', function() { console.log('match: ', fs.readFileSync('origin.png') == POST.file.content); // 1 console.log(POST.file.content == fs.readFileSync('copy.png')); // 2 }); response.end(); }) } else { response.setHeader('Content-Type', 'text/html'); response.end(` <form action="/post" method="post" enctype="multipart/form-data"> <input type="file" name="file" /> <input type="text" name="text" /> <input type="submit" /> </form> `); } }).listen(80); console.log('Node.js started'); Файл form.js, парсер для формы: module.exports = function(request, content) { /* if (request.headers['content-length'] != content.length) { //options.error(1); return; }*/ var result = {}; content.split('--'+ /boundary=(.+)$/.exec(request.headers['content-type'])[1]).slice(1, -1).forEach(function(part) { var exec = part.split('\r\n\r\n'), info = exec[0]; var name = /name="([^"]+)"/.exec(info)[1], fname = '', type = ''; if (info.includes('\n')) { // имеется рядок с Content-Type fname = (/filename="([^"]+)"/.exec(info) || [])[1]; type = (/Content-Type: ([^\n]+)/.exec(info) || [])[1]; } var value = exec.slice(1).join('\r\n\r\n'); while (value.endsWith('\r\n')) { // убираем лишние \r\n в конце полей value = value.slice(0, -2); } result[name] = type ? { type: type, fileName: fname, content: value } : value; }); return result; }; |
|
И к чему ты это?
Браузер сам формирует запрос в FormData.. ты о моём парсере? |
2chan,
Я как то трахался с этим, в ноде, подробностей не помню, но помню, что она косячила, портила файл(мб просто версия содержала ошибку). Я проверял на другом серваке, все работало, в ноде же файл забирался запоротым.. А так, там все достаточно просто, она достается из request.headers или чего то в этом роде. К сожалению б*кая нода не предоставляет сырую строку, которая приходит на сервак(или я х*во искал) короче, попробуй поковырять request.headers. дальше просто выдергиваешь этот кусок и сохраняешь на диск. |
Спасибо, сейчас попробую поковырять headers
|
Цитата:
|
2chan,
корежит сам файл, который приходит из сети. Я не знаю на каком этапе там это происходит, но когда достаешь этот файл, сохраняешь на диск, потом открываешь, картинка отображается некорректно. Если открываешь текстовым редактором, и сравниваешь с оригиналом, то видно, что там добавляются какие то пробелы, или табы, хз. Короче бинарь запарывается. Но это у меня так было. Может просто версия была косячная. |
2chan,
то есть, да формдату, ее содержимое, точней |
Цитата:
|
Провёл пару экспериментов.
Следующие куски кода работает нормально: fs.readFile('origin.png', function(error, result) { fs.writeFile('copy.png', result, function() {}); }); var content = fs.readFileSync('origin.png'); fs.writeFileSync('copy.png', content); То есть проблема возникает только когда записываешь в файл именно полученные через form-data данные. В таком случае файлы ломаются. |
Часовой пояс GMT +3, время: 21:04. |