如何使用restify上传文件
How to upload file using restify
我正在尝试使用 Restify 模块将图像文件上传到 Rest 服务器(更具体地说是 Confluence),但出现断言错误。我不确定我是否使用正确的方法将文件上传到 REST 服务器。谁能指出我正确的方向?
这是我的尝试 -
var restify = require('restify');
var header = {'Authorization': 'Basic xxxxx', 'content-type': 'multipart/form-data'};
var client = restify.createJsonClient({
url: 'http://www.testsite.com',
version: '*',
headers: header
});
var image = "c:\Users\abc\Documents\bbb.jpg";
var fileStream = fs.createReadStream(image);
var stat = fs.statSync(image);
var size = stat["size"];
var param = "?pageId=123&filename=mynewimage&mimeType=image%2Fjpeg&size=" + size;
fileStream.pipe(
client.post("/plugins/drag-and-drop/upload.action"+param, function(err, req, res, obj) {
if (err) {
return err;
}
})
);
更新:
这是我收到的断言错误 assert.js:86
throw new assert.AssertionError({
^
AssertionError: body
at Object.module.exports.(anonymous function) [as ok] (c:\Users\abc\myproj\node_modules\restify\node_modules\assert-pl
us\assert.js:242:35)
at JsonClient.write (c:\Users\abc\myproj\node_modules\restify\lib\clients\json_client.js:31:12)
at ReadStream.ondata (_stream_readable.js:540:20)
at ReadStream.emit (events.js:107:17)
at readableAddChunk (_stream_readable.js:163:16)
at ReadStream.Readable.push (_stream_readable.js:126:10)
at onread (fs.js:1683:12)
at FSReqWrap.wrapper [as oncomplete] (fs.js:529:17)
要发送 multipart/form-data
,您必须使用 restify
以外的库,因为它不支持 Content-Type
。
您可以使用 request
,它支持 multipart/form-data
内置的 http 请求。
我在发送包含 multipart/form-data
的请求和使用 restify 5
在 API 上处理此请求时遇到了困难。根据 @mscdex 的回答,我想出了以下处理这两种情况的代码:
"use strict"
const restify = require('restify'),
plugins = require('restify-plugins'),
fs = require('fs'),
request = require('request'),
FormData = require('form-data');
var server = restify.createServer();
server.use(plugins.multipartBodyParser()); // Enabling multipart
// Adding route
server.post('/upload', (req, res, next) =>{
/**
* Processing request containing multipart/form-data
*/
var uploaded_file = req.files.mySubmittedFile; // File in form
//Reading and sending file
fs.readFile(uploaded_file.path, {encoding: 'utf-8'}, (err, data)=>{
// Returning a JSON containing the file's name and its content
res.send({
filename: uploaded_file.name,
content: data
});
next()
});
});
// Launching server at http://localhost:8080
server.listen(8080, start);
// Client request
function start(){
// Making a request to our API using form-data library
// Post file using multipart/form-data
var formData = {
mySubmittedFile: fs.createReadStream('/tmp/hello.txt')
}
request.post({'url': 'http://localhost:8080/upload', formData: formData}, function(err, res, body){
console.log("Response's body is: "+ body);
});
}
使用:
- form-data@2.2.0
- 请求@2.81.0
- restify@5.0.1
- restify-plugins@1.6.0
- 节点@6.11.1
我尝试不使用库 form-data
和 request
只使用 restify/http 但我得到了一个可怕的长代码。
我正在尝试使用 Restify 模块将图像文件上传到 Rest 服务器(更具体地说是 Confluence),但出现断言错误。我不确定我是否使用正确的方法将文件上传到 REST 服务器。谁能指出我正确的方向?
这是我的尝试 -
var restify = require('restify');
var header = {'Authorization': 'Basic xxxxx', 'content-type': 'multipart/form-data'};
var client = restify.createJsonClient({
url: 'http://www.testsite.com',
version: '*',
headers: header
});
var image = "c:\Users\abc\Documents\bbb.jpg";
var fileStream = fs.createReadStream(image);
var stat = fs.statSync(image);
var size = stat["size"];
var param = "?pageId=123&filename=mynewimage&mimeType=image%2Fjpeg&size=" + size;
fileStream.pipe(
client.post("/plugins/drag-and-drop/upload.action"+param, function(err, req, res, obj) {
if (err) {
return err;
}
})
);
更新:
这是我收到的断言错误 assert.js:86
throw new assert.AssertionError({ ^ AssertionError: body at Object.module.exports.(anonymous function) [as ok] (c:\Users\abc\myproj\node_modules\restify\node_modules\assert-pl us\assert.js:242:35) at JsonClient.write (c:\Users\abc\myproj\node_modules\restify\lib\clients\json_client.js:31:12) at ReadStream.ondata (_stream_readable.js:540:20) at ReadStream.emit (events.js:107:17) at readableAddChunk (_stream_readable.js:163:16) at ReadStream.Readable.push (_stream_readable.js:126:10) at onread (fs.js:1683:12) at FSReqWrap.wrapper [as oncomplete] (fs.js:529:17)
要发送 multipart/form-data
,您必须使用 restify
以外的库,因为它不支持 Content-Type
。
您可以使用 request
,它支持 multipart/form-data
内置的 http 请求。
我在发送包含 multipart/form-data
的请求和使用 restify 5
在 API 上处理此请求时遇到了困难。根据 @mscdex 的回答,我想出了以下处理这两种情况的代码:
"use strict"
const restify = require('restify'),
plugins = require('restify-plugins'),
fs = require('fs'),
request = require('request'),
FormData = require('form-data');
var server = restify.createServer();
server.use(plugins.multipartBodyParser()); // Enabling multipart
// Adding route
server.post('/upload', (req, res, next) =>{
/**
* Processing request containing multipart/form-data
*/
var uploaded_file = req.files.mySubmittedFile; // File in form
//Reading and sending file
fs.readFile(uploaded_file.path, {encoding: 'utf-8'}, (err, data)=>{
// Returning a JSON containing the file's name and its content
res.send({
filename: uploaded_file.name,
content: data
});
next()
});
});
// Launching server at http://localhost:8080
server.listen(8080, start);
// Client request
function start(){
// Making a request to our API using form-data library
// Post file using multipart/form-data
var formData = {
mySubmittedFile: fs.createReadStream('/tmp/hello.txt')
}
request.post({'url': 'http://localhost:8080/upload', formData: formData}, function(err, res, body){
console.log("Response's body is: "+ body);
});
}
使用:
- form-data@2.2.0
- 请求@2.81.0
- restify@5.0.1
- restify-plugins@1.6.0
- 节点@6.11.1
我尝试不使用库 form-data
和 request
只使用 restify/http 但我得到了一个可怕的长代码。