42

NodeJS の学習を始めたばかりで、問題が発生しています。サーバーにファイルをアップロードしたいと思います。そうするために、このモジュールmulterを検索して見つけました。GitHub の例のように動作します:

var express = require('express');
var multer = require('multer');
var upload = multer({ dest: 'uploads/' });

var app = express()

app.post('/uploadImage', upload.single('image'), function(req, res) {
    console.log(req.file);
});

FormData で画像を投稿すると/uploadImage、画像はディレクトリに保存されuploads/ます。問題は、画像が奇妙な名前で保存されていることです。元の名前で保存したいと思います。そのためには、呼び出す必要があることを理解しました。その後、次のように関数でapp.use(multer({ dest: 'uploads/' }))' アクセスできるようになります。req.file

app.post('/uploadImage', function(req, res) {
    console.log(req.file);
});

しかし、app.use() を試すとエラーが発生します。

TypeError: app.use() requires middleware functions
    at EventEmitter.use (project\node_modules\express\lib\application
.js:209:11)

NodeJS 0.12.7 と Express 4.13.1 を使用しています

どうすればそのアップロードを達成できますか? ありがとう。

4

7 に答える 7

59

app.use(multer({dest:'./uploads/'}))次のいずれかの形式で使用する必要があります。

app.use(multer({dest:'./uploads/'}).single(...));
app.use(multer({dest:'./uploads/'}).array(...));
app.use(multer({dest:'./uploads/'}).fields(...));

すなわち:

app.use(multer({dest:'./uploads/'}).single('photo'));

そして、必ず次のようなものを用意してください:

<form action="/postPhotos" enctype="multipart/form-data" method="post">
    <input type="file" name="photo">
    <input type="submit" value="Upload photo">
</form>

あなたのhtmlで。

于 2015-07-27T23:28:28.730 に答える
21
var app = require('express');

var multer = require('multer');

app=express();

app.use(multer({dest:__dirname+'/file/uploads/'}).any());

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

    console.log(req.files);

    res.redirect('/');

});
于 2016-03-15T19:46:49.040 に答える
10

@127.0.0.1 からの回答は正しいですが、 Express Routerを使用している場合は、コードが少し変更されます。

var express = require('express');
var multer = require('multer');

var router = express.Router();

var uploads = multer({
  dest: 'public/uploads/'
});

router.post('/upload', uploads.single('avatar'), function(req, res, next) {
  console.log(req.file);

  //...
});

そして、重要な点として、フォームのエンコーディングenctype="multipart/form-data"は、次のように、既に述べたとおりにする必要があります。

<form action="/upload" enctype="multipart/form-data" method="post">
    <input type="file" name="avatar">
    <input type="submit" value="Go avatar go!">
</form>
于 2016-05-13T06:59:24.290 に答える
7

multer を使用してファイル名を変更することはできませんが、Node.js ストリームと fs モジュールを使用して、既にアップロードされたファイルの内容を同じフォルダー内の新しいファイル (元のファイル名として設定) にコピーし、古いファイルを削除することができます。

まず、ノード スクリプトに fs、path、および multer をインポートします。

var express = require('express');
var multer = require('multer');
var fs = require('fs');
var pathModule = require('path');

ここで、以下のように multer を使用して任意のタイプのファイルの宛先ディレクトリを設定します。

var app = express();
app.use(multer({dest:__dirname+'/resoucres/'}).any());

問題を解決するには、stream と fs を使用します。

app.post('/uploadImage', function(request, response) {
    var readerStream = fs.createReadStream(request.files[0].path);
    var dest_file = pathModule.join(request.files[0].destination, request.files[0].originalname);
    var writerStream = fs.createWriteStream(dest_file);

    var stream = readerStream.pipe(writerStream);
    stream.on('finish', function(){
        fs.unlink(request.files[0].path);
    });
});
于 2017-05-22T11:34:04.890 に答える
6

バージョン 1.0.0 以降

var upload = multer({ dest: 'tmp/' });
app.post('/file_upload', upload.single('photo'), function (req, res) {
于 2015-09-12T10:43:43.197 に答える
4

app.use(multer({dest:'./uploads/'}).single('photo')); に変更 app.js でサーバーを起動するのに役立ちます

于 2016-05-20T10:51:01.907 に答える