node. java 上传文件_NodeJS / Restify:如何在API中接收文件上传?

我正在尝试从移动应用程序上传一个图像文件(它是用本机编写的,现在在iOS上运行) .

该文件将发送到我的REST API,如下所示 . 我有两个问题:

我没有得到 req.body ,因为它总是一个空对象,虽然 Headers 是正确提交的 .

我想通过 gridfs-stream 将收到的文件写入我的数据库(GridFS),但我不明白该代码的放置位置 .

API

const restify = require('restify')

const winston = require('winston')

const bunyanWinston = require('bunyan-winston-adapter')

const mongoose = require('mongoose')

const Grid = require('gridfs-stream')

const config = require('../config')

// Configure mongoose to work with javascript promises

mongoose.Promise = global.Promise

// Setting up server

const server = restify.createServer({

name: config.name,

version: config.version,

log: bunyanWinston.createAdapter(log)

})

server.use(restify.plugins.multipartBodyParser())

server.listen(config.port, () => {

mongoose.connection.on('open', (err) => {

server.post('/upload', (req, res, next) => {

console.log(req.headers) //

/* Problem 1 */

console.log(req.body) //

res.send(200, { message: 'successful upload' })

res.end()

})

})

global.db = mongoose.connect(config.db.uri, { useMongoClient: true })

/* Problem 2: The recieved file should be stored to DB via `gridfs-stream` */

// I think this is the wrong place for this line...

var gfs = Grid(global.db, mongoose.mongo)

})

我试图找到错误,但我没有找到它,所以这里是我在API中获得的数据:

{

host: 'localhost:3000',

'content-type': 'multipart/form-data; boundary=pUqK6oKvY65OfhaQ3h01xWg0j4ajlanAA_e3MXVSna4F8kbg-zT0V3-PeJQm1QZ2ymcmUM',

'user-agent': 'User/1 CFNetwork/808.2.16 Darwin/15.6.0',

connection: 'keep-alive',

accept: '*/*',

'accept-language': 'en-us',

'accept-encoding': 'gzip, deflate',

'content-length': '315196'

}

身体

{ }

为什么 body 为空?

React Native file upload

这就是我将文件发送到API的方式 . 我还向您展示了一些变量的内容:

async function upload (photo) {

console.log('photo', photo); // OUTPUT SHOWN BELOW

if (photo.uri) {

// Create the form data object

var data = new FormData()

data.append('picture', { uri: photo.uri, name: 'selfie.jpg', type: 'image/jpg' })

// Create the config object for the POST

const config = {

method: 'POST',

headers: {

'Accept': 'application/json'

},

body: data

}

console.log('config', config); // OUTPUT SHOWN BELOW

fetchProgress('http://localhost:3000/upload', {

method: 'post',

body: data

}, (progressEvent) => {

const progress = progressEvent.loaded / progressEvent.total

console.log(progress)

}).then((res) => console.log(res), (err) => console.log(err))

}

}

const fetchProgress = (url, opts = {}, onProgress) => {

console.log(url, opts)

return new Promise((resolve, reject) => {

var xhr = new XMLHttpRequest()

xhr.open(opts.method || 'get', url)

for (var k in opts.headers || {}) {

xhr.setRequestHeader(k, opts.headers[k])

}

xhr.onload = e => resolve(e.target)

xhr.onerror = reject

if (xhr.upload && onProgress) {

xhr.upload.onprogress = onProgress // event.loaded / event.total * 100 ; //event.lengthComputable

}

xhr.send(opts.body)

})

}

照片

{

fileSize: 314945,

origURL: 'assets-library://asset/asset.JPG?id=106E99A1-4F6A-45A2-B320-B0AD4A8E8473&ext=JPG',

longitude: -122.80317833333334,

fileName: 'IMG_0001.JPG',

height: 2848,

width: 4288,

latitude: 38.0374445,

timestamp: '2011-03-13T00:17:25Z',

isVertical: false,

uri: 'file:///Users/User/Library/Developer/CoreSimulator/Devices/D3FEFFA8-7446-42AB-BC7E-B6EB88DDA840/data/Containers/Data/Application/17CE8C0A-B781-4E56-9347-857E74055119/Documents/images/69C2F27F-9EEE-4611-853E-FC7FF6E5C373.jpg'

}

配置

'http://localhost:3000/upload',

{

method: 'post',

body:

{

_parts:

[

[ 'picture',

{ uri: 'file:///Users/User/Library/Developer/CoreSimulator/Devices/D3FEFFA8-7446-42AB-BC7E-B6EB88DDA840/data/Containers/Data/Application/17CE8C0A-B781-4E56-9347-857E74055119/Documents/images/69C2F27F-9EEE-4611-853E-FC7FF6E5C373.jpg',

name: 'selfie.jpg',

type: 'image/jpg' }

]

]

}

}

我认为 data (应该在 config 中作为正文发送)格式错误 . 为什么数组中有数组?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值