2017-01-12 3 views
0

Я пытаюсь разработать простой обработчик загрузки файлов.NodeJS - обработчик загрузки файла на стороне сервера

Единственное, что я хочу, это приложение получает файл от клиента и сохраняет на hdd.

(я не хочу, чтобы загрузить файл с nodejs, я просто хочу, чтобы получить пост загрузки файла и сохранить его на моем НЖМД)

, как я могу это сделать?

Я пробовал этот способ, но он работает не так, как ожидалось.

var http = require('http'), 
 
    path = require('path'), 
 
    os = require('os'), 
 
    fs = require('fs'); 
 

 
var Busboy = require('busboy'); 
 

 
http.createServer(function(req, res) { 
 
    if (req.method === 'POST') { 
 
\t \t 
 
\t try{ 
 

 
    var busboy = new Busboy({ headers: req.headers }); 
 
    busboy.on('file', function(fieldname, file, filename, encoding, mimetype) { 
 
\t \t 
 
\t \t var fstream = fs.createWriteStream('asdasd'); 
 
     file.pipe(fstream); 
 
     fstream.on('close', function() { 
 
\t \t \t res.writeHead(200, { 'Connection': 'close' }); 
 
      res.send('upload succeeded!'); 
 
     }); 
 
\t \t 
 
     /*var saveTo = path.join(os.tmpDir(), path.basename(fieldname)); 
 
     file.pipe(fs.createWriteStream('./output.asdasd')); 
 
\t fstream.*/ 
 
    }); 
 
    busboy.on('finish', function() { 
 
     res.writeHead(200, { 'Connection': 'close' }); 
 
     res.end("That's all folks!"); 
 
    }); 
 
    return req.pipe(busboy); 
 
\t } 
 
\t catch(err){ 
 
\t \t console.log('error : ' + err); 
 
\t \t res.writeHead(404); 
 
\t \t res.end(); 
 
\t } 
 
    } 
 
    res.writeHead(404); 
 
    res.end(); 
 
}).listen(4842, function() { 
 
    console.log('Listening for requests'); 
 
});

+0

Если ваша проблема была решена чьей-то ответ, пожалуйста, отметьте, что ответ как правильно. Если вы сами придумали этот ответ, напишите его как ответ в разделе ответов (не как часть вопроса) и отметьте его правильно. –

+0

Кроме того, мы не используем [разрешенные] заголовки здесь - вместо этого используйте систему приема. Вы можете принять свой собственный ответ, хотя, если кто-то другой вам очень помог, это хороший жест, чтобы принять их вместо этого. – halfer

ответ

0

решаемые,

Я пробовал с почтальоном, я изменил свое мнение и попытался его с RESTClient, она успешно работает сейчас :)

0

Просто используйте FS API от узла для записи полученных данных в файле? :)

https://nodejs.org/api/fs.html#fs_class_fs_writestream

+0

хорошая идея, я пробовал это по методу busboy.on ('file'), но метод busboy.on ('file') не запускался, любые идеи :( –

+0

Вы уверены, что отправляете по многоквартирному типу? – Mech45

+0

Да это is.im тестируя его с помощью файла rar и mp4. –

1

Я никогда не использовал busboy раньше, но пример отдана в их GitHub documentation работает отлично.

let http = require('http'), 
    path = require('path'), 
    os = require('os'), 
    fs = require('fs'); 

let Busboy = require('busboy'); 

http.createServer(function (req, res) { 

    if (req.method === 'POST') { 

    let busboy = new Busboy({ headers: req.headers }); 

    // handle all incoming `file` events, which are thrown when a FILE field is encountered 
    // in multipart request 
    busboy.on('file', function (fieldname, file, filename, encoding, mimetype) { 

     // figure out where you want to save the file on disk 
     // this can be any path really 
     let saveTo = path.join(os.tmpdir(), path.basename(filename)); 

     // output where the file is being saved to make sure it's being uploaded 
     console.log(`Saving file at ${saveTo}`); 

     // write the actual file to disk 
     file.pipe(fs.createWriteStream(saveTo)); 
    }); 

    busboy.on('finish', function() { 

     res.writeHead(200, { 'Connection': 'close' }); 
     res.end("That's all folks!"); 
    }); 

    return req.pipe(busboy); 
    } 

    res.writeHead(404); 
    res.end(); 

}).listen(8000, function() { 
    console.log('Listening for requests'); 
}); 

Я добавил некоторые комментарии в соответствующем разделе, чтобы уточнить, как это работает. Если вам нужна дополнительная информация, просто напишите ниже, и я добавлю их.

+0

Спасибо Uzair :) Все в порядке, но я не могу сохранить файл с файлом file.pipe (fs.createWriteStream ('my.file')), что я делаю неправильно? –

+0

Убедитесь, что путь, который вы пытаетесь записать, записывается процессом узла. Вы можете использовать './My.file', чтобы сделать его относительным, но безопасным способом было бы использовать текущий рабочий каталог и использовать« путь »для его присоединения. Пример: 'path.join (process.cwd(), 'my.file')'. Это гарантирует правильность путей для каждой ОС. Вторая проверка заключается в том, чтобы увидеть, добавлен ли 'console.log' до того, как строка' file.pip() 'будет запущена. –

+0

@ developer.alp Также убедитесь, что вы сначала протестировали его с помощью небольшого файла, который меньше 500 КБ, чтобы убедиться, что код работает. Большие файлы часто вызывают проблемы, которые не связаны с этим фрагментом кода. –

Смежные вопросы