3

完了しようとしているプロジェクトがあります。画像をアップロードしたいです。画像をアップロードできますが、アップロードするディレクトリにはアップロードできません。

よし、コーディングしましょう:

 app.post('/register',function(req,res) 
    {
var form = new formidable.IncomingForm();
form.keepExtensions = true;
form.uploadDir ='./uploaded/';
form
    .on('error', function(err) {
        throw err;
    })

    .on('field', function(field, value) {
        //receive form fields here
    })

    /* this is where the renaming happens */
    .on ('fileBegin', function(name, file){
            //rename the incoming file to the file's name
            file.path = form.uploadDir + "/" + file.name;
    })

    .on('file', function(field, file) {
        //On file received
    })

    .on('progress', function(bytesReceived, bytesExpected) {
        //self.emit('progess', bytesReceived, bytesExpected)

        var percent = (bytesReceived / bytesExpected * 100) | 0;
        process.stdout.write('Uploading: %' + percent + '\r');
    })

    .on('end', function() {


    });

form.parse(req);

問題は、画像を投稿すると...画像がまだprocess.env.TMPに保存されていることです。私のプロジェクトにはこのdir arqがあります

proyect:
    node_modules
    uploaded
    public
    routes
    views
    app.js
    package.json

編集2:問題はBODYPARSERです

最後のコードからわかりました...問題は、アプリにbodyParserがあるように構成したときのapp.jsでした。

誰かがコードを使用したい場合は、最後のコードは機能的に正しく機能しています... Express.configure の行にコメントするだけです

app.use(express.bodyParser());

エクスプレスボディパーサーをオフにしますが、エクスプレスの使用も手ごわいので、同じことです...

別の問題があります

私はこのようにexpress.bodyParserを設定します

  app.use(express.bodyParser(
    {
      uploadDir: './uploads',
      keepExtensions: true
    }));

私はこのように最初のコードを変更します

app.post('/register',function(req,res) 
{
  var oldDir=req.files.img.path;
  var newDir='./uploads/'+req.body.email+'/perfil/';

if(req.files)
{
  mkdirp(newDir,0777,function(err){
    if(err) throw err;
  })
}
if(req.files)
{
  fs.rename(oldDir,newDir+req.files.img.name,function(err){
    if(err) throw err;
  });

}
res.send('pow!');

それは機能的であり、このコードがファイルを受信すると、ファイルをアップロードフォルダーに入れ、次に電子メールの名前でフォルダーを作成し、最後にファイルを電子メールフォルダーに移動し、元のファイルのように拡張子を付けて名前を変更します

パーフェクトだ"!

いや、完璧なんてない… この方法を使いたい

.on ('fileBegin', function(name, file){
            //rename the incoming file to the file's name
            file.path = form.uploadDir + "/" + file.name;
    })
    .on('progress', function(bytesReceived, bytesExpected) {
        //self.emit('progess', bytesReceived, bytesExpected)

        var percent = (bytesReceived / bytesExpected * 100) | 0;
        process.stdout.write('Uploading: %' + percent + '\r');
    })

最初のコードから、サーバーがファイルを受信した後にファイルを移動する 2 番目のコードで最初からファイルを配置する場所を構成できるためです。

Express はミドルウェアのように手ごわいので、方法は Express だと思います。

メソッドを設定するにはどうすればよいですか??

メソッドはどこにありますか...?'?

2 番目のコードから req.files に含まれるメソッドを知るにはどうすればよいですか?? (bodyParser() を使用する req.files は、最初のコードで formidable を使用する form.file と同じであるため)

tnx すべて

4

2 に答える 2

8

IncomingForm コンストラクターはオプション オブジェクトを受け取ります。おそらく、パスでも __dirname グローバルを使用する必要があります。

var form = new formidable.IncomingForm({ uploadDir: __dirname + '/uploaded' });

オプションがどのように適用されるかは、手ごわいソースで確認できます。

于 2012-07-25T03:49:28.613 に答える
-2

ファイルが完全にアップロードされた後に名前が変更されるように、「終了」がトリガーされたときに名前変更コードを保持できます。

于 2014-09-04T05:22:54.597 に答える