2013-11-06 3 views
13

Я использовал модуль Winston для создания ежедневного файла журнала для своего автономного приложения. Теперь я должен иметь возможность отправлять или загружать этот файл на удаленный сервер через POST (эта часть уже существует)NodeJS: отправка/загрузка локального файла на удаленный сервер

Я знаю, что мне нужно записать файл в куски, чтобы он не зависал память, поэтому я используя fs.createReadStream однако я, кажется, получаю только ответ 503, даже если отправляю только образец текста.

EDIT

Я работал, что приемник ожидал данные, которые будут названы «данные». Я удалил createReadSteam, поскольку я мог только заставить его работать с 'application/x-www-form-urlencoded' и синхронным fs.readFileSync. Если я изменю это на «multipart/form-data» на php-сервере, я смогу снова использовать createReadStream или это произойдет, только если я перейду на физическую загрузку json-файла.

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

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

var post_options = { 
    host: 'logger.mysite.co.uk', 
    path: '/', 
    port: 80, 
    timeout: 120000, 
    method: 'POST', 
    headers: { 
     'Content-Type': 'application/x-www-form-urlencoded' 
    } 
} 

var sender = http.request(post_options, function(res) { 
    if (res.statusCode < 399) { 
     var text = "" 
     res.on('data', function(chunk) { 
      text += chunk 
     }) 
     res.on('end', function(data) { 
      console.log(text) 
     }) 
    } else { 
     console.log("ERROR", res.statusCode) 
    } 
}) 

var POST_DATA = 'data={[' 
POST_DATA += fs.readFileSync('./path/file.log').toString().replace(/\,+$/,'') 
POST_DATA += ']}' 
console.log(POST_DATA) 
sender.write(POST_DATA) 
sender.end() 
+1

Вы пробовали загрузить файл, используя что-то вроде 'curl', чтобы убедиться, что удаленный сервер фактически принимает данные? Это может иметь проблемы с типом содержимого 'application/json'. Кроме того, является ли файл журнала фактически в формате JSON? – robertklep

+0

У вас может быть точка здесь. Есть ли разница между загрузкой json-файла или открытием json-файла и отправкой его в виде фрагментов данных POST (фактически не отправки файла) – sidonaldson

+0

Если вы отправляете его с помощью 'application/json' как' Content-Type', файл может не быть обрабатываться как «регулярная» загрузка. Если вы хотите регулярную загрузку, вам следует рассмотреть возможность использования «запроса» или, по крайней мере, ['form-data'] (https://github.com/felixge/node-form-data), поскольку загрузка файлов не является тривиальной для реализации , – robertklep

ответ

0

Посмотрите на модуль request.

Он предоставит вам возможность передавать файл в POST-запросы.

+0

Он уже поет файл. – robertklep

+0

Я вижу это. Запрос позволяет передавать файл напрямую на другой запрос. Посмотрите документацию. – swhitewvu24

+0

Из документов: fs.createReadStream ('file.json') .pipe (request.put ('http://mysite.com/obj.json')) – swhitewvu24

8

скопирована из https://github.com/mikeal/request#forms

var r = request.post('http://service.com/upload', function optionalCallback (err, httpResponse, body) { 
    if (err) { 
    return console.error('upload failed:', err); 
    } 
    console.log('Upload successful! Server responded with:', body); 
}) 
var form = r.form() 
form.append('my_field1', 'my_value23_321') 
form.append('my_field2', '123123sdas') 
form.append('my_file', fs.createReadStream(path.join(__dirname, 'doodle.png'))) 
Смежные вопросы