大きなファイルのアップロードのために、スキッパーとflowjsをng-flowと一緒に使用しようとしています。
flowjs リポジトリにあるNodejs のサンプルに基づいて、ファイルのアップロードを処理するための帆コントローラーとサービスを作成しました。小さなファイルをアップロードすると問題なく動作しますが、大きなファイル (200 Mb のビデオなど) をアップロードしようとすると、エラー (以下にリスト) が表示され、配列req.file('file')._files
が空になります。アップロード中に数回しか発生しないという興味深い事実。たとえば、flowjs がファイルを 150 チャンクにカットした場合、セイル コンソールでは、これらのエラーは 3 ~ 5 回しか表示されません。そのため、ほとんどすべてのチャンクがサーバーにアップロードされますが、一部が失われ、結果としてファイルが破損します。
verbose: Unable to expose body parameter `flowChunkNumber` in streaming upload! Client tried to send a text parameter (flowChunkNumber) after one or more files had already been sent. Make sure you always send text params first, then your files.
これらのエラーは、すべての flowjs パラメーターに対して表示されます。
スキッパーを正しく使用するには、テキスト パラメータを最初に送信する必要があることを知っています。そして、chrome ネットワーク コンソールで、flowjs がこのデータを正しい順序で送信することを確認しました。
助言がありますか?
コントローラー方式
upload: function (req, res) {
flow.post(req, function (status, filename, original_filename, identifier) {
sails.log.debug('Flow: POST', status, original_filename, identifier);
res.status(status).send();
});
}
サービスポスト方式
$.post = function(req, callback) {
var fields = req.body;
var file = req.file($.fileParameterName);
if (!file || !file._files.length) {
console.log('no file', req);
file.upload(function() {});
}
var stream = file._files[0].stream;
var chunkNumber = fields.flowChunkNumber;
var chunkSize = fields.flowChunkSize;
var totalSize = fields.flowTotalSize;
var identifier = cleanIdentifier(fields.flowIdentifier);
var filename = fields.flowFilename;
if (file._files.length === 0 || !stream.byteCount)
{
callback('invalid_flow_request', null, null, null);
return;
}
var original_filename = stream.filename;
var validation = validateRequest(chunkNumber, chunkSize, totalSize, identifier, filename, stream.byteCount);
if (validation == 'valid')
{
var chunkFilename = getChunkFilename(chunkNumber, identifier);
// Save the chunk by skipper file upload api
file.upload({saveAs:chunkFilename},function(err, uploadedFiles){
// Do we have all the chunks?
var currentTestChunk = 1;
var numberOfChunks = Math.max(Math.floor(totalSize / (chunkSize * 1.0)), 1);
var testChunkExists = function()
{
fs.exists(getChunkFilename(currentTestChunk, identifier), function(exists)
{
if (exists)
{
currentTestChunk++;
if (currentTestChunk > numberOfChunks)
{
callback('done', filename, original_filename, identifier);
} else {
// Recursion
testChunkExists();
}
} else {
callback('partly_done', filename, original_filename, identifier);
}
});
};
testChunkExists();
});
} else {
callback(validation, filename, original_filename, identifier);
}};
編集
maxChunkRetries: 5
デフォルトでは であるため、flowjs プロパティを設定するソリューションが見つかりました0
。サーバー側では、req.file('file')._files
が空の場合、(flowjs のコンテキストで) 永続的ではないエラーをスローしています。
それで、それは私の問題を解決しますが、なぜこのように振る舞うのかという疑問はまだ未解決です. flowjs および Nodejs のサンプル コードではconnect-multiparty
、追加のエラー処理コードが使用されていないため、おそらくスキッパー bodyparser バグです。