2015-02-26 3 views
0

Я пишу сервер node.js, где я принимаю файл вместе с контрольной суммой CRC32 по многопрофильному запросу. Я использую модули узлов busboy и crc для обработки многочастных запросов и операций CRC в узле.Контрольная сумма CRC32 не вычисляется в node.js

В случае busboyfinish, я пытаюсь вычислить контрольную сумму CRC32 сохраненного файла и проверить его на полученную контрольную сумму.

Моя проблема заключается в том, что в событии finish контрольная сумма всегда вычисляется как 0. Если я вручную запускаю контрольную сумму CRC32 в отношении того же файла, контрольная сумма будет правильно рассчитана.

Вот фрагмент кода, который я использую для обработки многослойного запроса с расчетом crc32:

var busboy = new Busboy({ headers : request.headers}); 
var saveTo; 
var crc32; 
busboy.on('file', function (fieldname, file, filename, encoding, mimetype) { 
    saveTo = path.join('files', '/', filename); 
    file.pipe(fs.createWriteStream(saveTo)); 
}); 

busboy.on('field', function(fieldname, val, fieldnameTruncated, valTruncated) { 
    if(fieldname == 'checksum') { 
     crc32 = val; 
    } 
}); 

busboy.on('finish', function() { 
    var savedFileCrc32 = crc.crc32(fs.readFileSync(saveTo)).toString(16); 
    console.log("CRC32 of saved file: " + savedFileCrc32 + " file: " + saveTo); 
}); 
request.pipe(busboy); 

Моей консоль всегда печатает CRC32 of saved file: 0 file: files/image.jpg

Однако, если я запускаю программу узла для вычисления CRC32 контрольной суммы файл, который был только что создан, он отлично работает и печатает контрольную сумму.

Изображение также сохраняется правильно. В событии finish, если я открываю поток чтения на saveTo и считываю байты, изображение считывается, поэтому файл уже существует.

Любая идея, в чем проблема?

+0

Если busboy передает запись в поток fs, знает ли он, когда это делается? – dandavis

+0

Я не уверен. Я думаю, @tgo имеет правильные вещи. Я попытаюсь написать файл синхронно и проверить, исправляет ли это проблему. –

ответ

1

Единственное, что я могу придумать, это то, что запись не закончена к тому времени, когда вы делаете readFileSync(). Вы можете проверить, существует ли файл перед чтением?

Мне также интересно, не на самом деле это duplicate of this.

+0

Хм .. Хорошая точка. Позвольте мне попытаться записать файл синхронно и посмотреть, не отличается ли это от –

+0

. Именно это и происходило. Вместо этого я использовал multiparty для анализа запроса Multipart, который напрямую сохраняет файлы в temp и только после этого дает мне окончательный обратный вызов. Благодаря! –

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

  • Нет связанных вопросов^_^