2012-05-20 2 views
4

Мне нужно нажать файл из приложения node.js на веб-сервер, работающий в другом месте, который принимает файлы через обычный механизм загрузки. Например, скажем, принимающий сервер имеет страницу с формой, как это:Загрузка файла программно из узла.js на другой веб-сервер

<form enctype="multipart/form-data" action="upload.php" method="POST"> 
file: <input name="uploaded" type="file" /><br /> 
name: <input type="text" name="filename" /><br /> 
<input type="submit" value="upload" /> 
</form> 

Если пользователь выбирает файл, а затем дает имя файла в поле ввода текста, то этот файл будет загружен на сервер, через upload.php (который я не контролирую) и сохранен в качестве имени. (в форме могут быть другие элементы, но я показываю только те, для простоты). PHP-скрипт будет отвечать простым текстовым ответом «ok» или «error ...» (с ошибкой).

Теперь, я хочу, чтобы программа могла отправлять файл с node.js на этот php-скрипт. Файл (на стороне node.js) может существовать или не существовать в файловой системе, или это может быть что-то, что приходит откуда-то еще, например, я могу вытащить его из URL-адреса, он может быть загружен пользователем, и т. д.

Я видел некоторые вещи вдоль этих строк, но я не уверен, как иметь дело с параметрами (имя файла и т. д.), и я не уверен, что подавать в объекте options. Также в этом примере предполагается, что он поступает из файла файловой системы, который, как я говорю, может быть или не быть.

fs.createReadStream(filename).pipe(http.request(options, function(response) { 
})); 
+0

В примере, который транслирует поток чтения, вы можете сделать это с потоками, которые не являются файлами ОС. Что вы пробовали и не работали? Могли ли вы решить эту проблему? –

+0

Да, я просто использовал модуль «плакат», и он обработал детали. :) – rob

+0

Отлично! Не могли бы вы добавить это как ответ (а также какой-то код, который вы использовали), и принять его? –

ответ

0

В итоге я просто использовал модуль «плакат», который упростил его. Вот тонкая обертка вокруг звонка на плакат. «fileId» - это имя элемента формы, представляющего файл, другие параметры просто помещаются в объект «поля».

var _poster = require('poster'); 

var uploadFileToRemoteServer = function (remoteScript, filename, fileId, fields, cb) { 
    _poster.post(
     filename, 
     { 
     uploadUrl: remoteScript, 
     method: "POST", 
     fileId: fileId, 
     fields: fields || {} 
     }, 
     function (err, r) { 
     if (err) { 
     } else { 
      if(cb) 
      cb(r); 
     } 
     }); 
    } 
+1

Для будущего ppl, который наткнется на этот https://www.npmjs.com/package/poster –