2017-08-18 13 views
0

をアップロードするとき、私は人々がサーバーに画像をアップロードできるようにするために、次のコードを使用しています2つのファイルを作成:ノードFS(ファイルストリーム)単一のファイル

app.post("/api/upload", function (req, res) { 

    fs.readFile(req.files[0].path, function (err, data) { 
    console.log('The data for the file..', data); 

    if (err) { 
     res.send(err).end(); 
    } else { 
     // ... 
     var newPath = __dirname + "/uploads/" + req.headers["account_id"] + '_' + moment().format('MM_DD_YYYY_HH-mm-ss') + '_' + req.files[0].originalname; 
     fs.writeFile(newPath, data, function (err) { 
     console.log('File Written'); 
     if (err) { 
      res.send(err).end(); 
     } else { 
      res.send({ 
      success: true, 
      file: newPath, 
      files: req.files 
      }).end(); 
     } 
     //res.end({"success": true}) 
     }); 
    } 
    }); 


}); 

問題がアップロードされますeveyファイルのために私はということですまたarrayBufferバージョン(と思う)参照を取得画像:私はこれを防ぐことができ、すべてのほとんどは、なぜそれが起こっているどのように

enter image description here

? ありがとう!

+0

ファイルはターゲットディレクトリに正常にアップロードされていますか? –

+0

また、ファイルのアップロードを支援するために、マルチユーザーなどを使用していますか? – Legman

+0

multerを使用していません –

答えて

0

一時的なアップロードファイルと保存されたファイルが表示されているようです。あなたのコードは、一時ファイル(req.files [0] .path)を削除するコードを追加するだけでうまくいくはずです。

0

multerのようなモジュールを使用すると、通常は(multerの場合は基底のバッキングストレージを変更しない限り)ファイルアップロードは(永続的に)ディスクに保存されます。だからあなたがファイルを読んでそれを書き戻すとき、あなたはコピーを持っています。

ファイルのコピーを作成する必要がある場合は、内容全体をメモリに読み込んでいるため、これは最も効率的な解決策ではありません。より効率的なコピーメカニズムが整うまでは、ストリーミングコピー(fs.createReadStream()fs.createWriteStream()を使用)を使用して、メモリ内のデータ量を最小限に抑える方がよいでしょう。

あなたの代わりに移動/、あなたはあなたが動的に宛先ファイル名を提供することをmulterなどを設定するか、multerをディスクに保存したファイルの名前を変更(利用可能なフックがある)、またはしたい場合後でファイルを移動または名前を変更するのにfs.rename()を使用できます。

+0

コードを提供できますか?私は、単に私のAPIからuploadsというフォルダにファイルをアップロードしたいと思っています。それでおしまい。 –

1

いつか私はmulterモジュールを使用して解決策を得ました。このモジュールを使用すると、ファイルと画像の両方をアップロードできます。そして、それは宛先フォルダに正常にアップロードされました。ここで

は私のサーバーコードapp.js

var express =r equire('express'); 
var multer = require('multer'); 
var path = require('path') 
var app = express(); 
var ejs = require('ejs') 
app.set('view engine', 'ejs') 
var storage = multer.diskStorage({ 
    destination: function(req, file, callback) { 
     callback(null, './public/uploads')//here you can place your destination path 
    }, 
    filename: function(req, file, callback) { 
     callback(null, file.fieldname + '-' + Date.now() + path.extname(file.originalname)) 
    } 
}) 

app.get('/api/file',function(req,res){ 
res.render('index'); 
}); 
app.post('/api/file', function(req, res) { 
    var upload = multer({ 
     storage: storage}).single('userFile'); 
    upload(req, res, function(err) { 
     console.log("File uploaded"); 
     res.end('File is uploaded') 
    }) 
}) 

app.listen(3000,function(){ 
console.log("working on port 3000"); 
}); 

viewsフォルダを作成した後node app.js .Openなどのブラウザやタイプhttp://localhost:3000/api/fileをサーバーを実行することで、この後

<!DOCTYPE html> 
<html lang="en"> 
<head> 
    <meta charset="UTF-8"> 
    <title></title> 
</head> 
<body> 
    <form id="uploadForm" enctype="multipart/form-data" method="post"> 
     <input type="file" name="userFile" /> 
     <input type="submit" value="Upload File" name="submit"> 
    </form> 
</body> 
</html> 

このindex.ejsファイルを配置していますrunnigこのURLは、あなたが目的のフォルダにアップロードしたいファイルを選択してください。そして、ターミナルとbrowser.Hopeの両方で成功した応答があなたのために役立つことを願っています。

関連する問題