2015-10-22 21 views
9

私はNode.js-expressアプリケーションでResumable.jsを使用しています。私はResumable.jsはサーバー側のディレクトリにファイルを保存できません

{ resumableChunkNumber: '77', 
    resumableChunkSize: '1048576', 
    resumableCurrentChunkSize: '1064195', 
    resumableTotalSize: '80755971', 
    resumableType: '', 
    resumableIdentifier: '80755971-humanfastq', 
    resumableFilename: 'human.fastq', 
    resumableRelativePath: 'human.fastq', 
    resumableTotalChunks: '77' } 

ドキュメントはこの後どうするかについてかなり曖昧です...私は(req.bodyを)はconsole.logすることができますので、ファイル転送が成功したことを知っているポイントを取得し、以下、これを見ることができますポイント。私はこのファイルを私のサーバー上のディレクトリに保存する必要があります。これを達成するための助けがあれば大いに感謝します。ありがとう!

+0

どれgithubの例は素晴らしいだろう... – Nodedeveloper101

+0

[OK]を、ファイル自体が「req.files.file」に位置しています...だから私は、ファイルのthats javascriptの変数を持っている... varファイル= req.files.file。 ....この変数をサーバー上の特定のディレクトリにファイルとして保存するにはどうすればよいですか? – Nodedeveloper101

+0

「fs」を使って.txtファイルをサーバーに書き込む方法を知りました。だから私はサーバーにファイルを書き込むことができます。そして、私はそのファイルに関するconsole.log()データを扱うことができます。しかし、実際にはファイルであるfs.writeFile(ファイル名、ファイル、コールバック)にどのオブジェクトを渡す必要があるのか​​わからない...今は[オブジェクトオブジェクト] – Nodedeveloper101

答えて

1

私はResumable.jsを使用していませんが、これと似たようなものがあります。ここではNodejs/expressサーバーでどのようにしていますか?また、こちらのサーバーコードの多くをご覧になることもできます:https://github.com/MichaelLeeHobbs/roboMiner/tree/master/server/api/worldしかし、これは完全ではなく、実験的なものです。以下のコードは唯一の例です。

import move from '../../libraries/fsMove.js'; 

    export function create(req, res) { 
     var file = req.files.file; 
     console.log(file.name); 
     console.log(file.type); 
     console.log(file.path); 
     console.log(__dirname); 
     move(file.path, __dirname + '/../../uploads/worlds/' + file.originalFilename, function(err){ 
     if (err) { 
      console.log(err); 
      handleError(res)(err); 
      return; 
     } 
     World.createAsync(req.body) 
      .then(responseWithResult(res, 201)) 
      .catch(handleError(res)); 
     }); 
    } 

    // fsMove.js 
    // http://stackoverflow.com/questions/8579055/how-i-move-files-on-node-js/29105404#29105404 
    var fs = require('fs'); 

    module.exports = function move (oldPath, newPath, callback) { 
     fs.rename(oldPath, newPath, function (err) { 
     if (err) { 
      if (err.code === 'EXDEV') { 
      copy(); 
      } else { 
      callback(err); 
      } 
      return; 
     } 
     callback(); 
     }); 

     function copy() { 
     var readStream = fs.createReadStream(oldPath); 
     var writeStream = fs.createWriteStream(newPath); 

     readStream.on('error', callback); 
     writeStream.on('error', callback); 
     readStream.on('close', function() { 

      fs.unlink(oldPath, callback); 
     }); 

     readStream.pipe(writeStream); 

     } 
    }; 
4

ない専門家ではなく、私はそれを試してみると、あなたのために働い例を得ませんでした。あなたはあなたの質問に十分な情報を提供していないので、私は最初から始めます。

私は公式のgithubリポジトリに従い、サンプルを提供しました。ファイルチャンクを特定のディレクトリに保存するためにいくつかの調整を加えてから、それらのチャンクを合わせて調整し、不要なものを削除するように調整しましたその後のチャンク。明らかに、これらの調整は、コードや他の場所で提供されているヒントです。 Appearntly flow.jsも同様のメカニズム(完全にはわからない)を使用しています。

私は基本的には、ブラウザからファイルをアップロードして、ローカルに保存することができるようにするために、サンプルの一つでapp.jsを変更する必要がありました。

  1. パスディレクトリの場所は、チャンクがアップロードされている場合、あなたは書き込みストリームを作成し、一緒にチャンクをステッチし、それらを保存するために、再開可能使用するようにファイルのチャンクが
  2. が必要条件とコマンドを提供する追加すべき場所を再開可能にします元のファイルとして。

    1. 最後に削除するすべてのチャンク

    指示は明示アプリは、(あなたが公式githubのサンプルをチェックアウトし、変更を加えたり、指示の下に従うことができますすることができます)作業を取得するためにgistを使用します

  3. コピー/ package.jsonを貼り付け得るためにNPMをインストールしない
  4. ディレクトリに要旨をapp.js、resumable.jsと再開可能-のNode.jsを作成したディレクトリ
  5. を作成します。モジュール(または手動でnpm installこれらexpresspathfsconnect-multiparty
  6. がメインのappディレクトリにuploadsディレクトリを作成し、それが書き込み可能であることを確認して
  7. コピー/の形でiconsが含まれていhereからpublicディレクトリ過去.pngファイルで、style.cssindex.htmlアップロード用
  8. 49または50のインデックスのtarget値を変更します。あなたのサーバアドレスにコピーした公開ディレクトリのhtmlを私のケースでhttp://localhost:3000/upload
  9. index.htmlでチャンクサイズ、同時チャンクアップロード数などを微調整することはできますが、実際にはチャンクを3から4に変更しました)
  10. 上記の作業をすべて完了したら、あなたはうまく行きます。
  11. 実行アプリはすなわちnodemon app.jsまたはノードは、サーバーのアドレスまたはhttp://localhost:3000/upload
  12. 移動をapp.jsし、以下に示すように、あなたは、レンダリングのindex.htmlが表示されます。

enter image description here

A

enter image description here

- (チャンクを除去する。終了に気付く)以下コンソールログ最後にアップロードディレクトリにimage2.jpgがあります。

TL; DRは

あなたはアップロードしResumable.js経由でアップロードされたファイルを保存できるようにapp.jsとのindex.htmlファイルに次の調整を必要としています。

のindex.htmlはどこへresumableディレクトリを送信するためにhttp://localhost:3000/upload

var r = new Resumable({ 
    target:'http://localhost:3000/upload', 
    chunkSize:1*1024*1024, 
    simultaneousUploads:4, 
    testChunks:false, 
    throttleProgressCallbacks:1 
}); 

が調整されているapp.js私の場合には、サーバーのURLにそれを指すように目標値を変更するために調整されていますファイルを保存します(一番上)。

var resumable = require('./resumable-node.js')(__dirname + "/uploads"); 

私もgistを参照してくださいapp.post('/uploads',...)の内容を変更するapp.jsを微調整。

// Handle uploads through Resumable.js 
app.post('/upload', function(req, res){ 
    resumable.post(req, function(status, filename, original_filename, identifier){ 
    if (status === 'done') { 
     var stream = fs.createWriteStream('./uploads/' + filename); 

     //stich the chunks 
     resumable.write(identifier, stream); 
     stream.on('data', function(data){}); 
     stream.on('end', function(){}); 

     //delete chunks 
     resumable.clean(identifier); 
    } 
    res.send(status, { 
     // NOTE: Uncomment this funciton to enable cross-domain request. 
     //'Access-Control-Allow-Origin': '*' 
    }); 
    }); 
}); 

そして最後にapp.jsへの最後の微調整は私が、他の人と同じディレクトリにファイルresumable.jsを移動し、最後のルートハンドラー、次のファイル

s.createReadStream("./resumable.js").pipe(res); 

であります私はcreateReadStreamがそれを見つけるために場所を変更する必要がありました。

関連する問題