【问题标题】:How to write a Node.js express API for file uploading?如何编写用于文件上传的 Node.js express API?
【发布时间】:2016-05-15 02:58:09
【问题描述】:

网上有很多关于 Node.js Express 框架文件上传的例子。但他们中的大多数都在使用 multer。所有这些都是从表单加载文件。

但我的情况不同。我的应用程序将从手机中选择一张图片并上传到服务器(通过使用 Ionic 中的 cordova-file-transfer 插件)。在这种情况下,我根本没有表格。这样就没有req.files。有什么建议吗?谢谢。

附注: 这是我服务器中的日志记录我的 http 标头:

{ host: 'localhost:3000',
  'x-requested-with': 'XMLHttpRequest',
  accept: '*/*',
  'content-type': 'multipart/form-data; boundary=+++++org.apache.cordova.formBoundary',
  'content-length': '23394',
  'accept-language': 'en-us',
  'accept-encoding': 'gzip, deflate',
  connection: 'keep-alive',
  'user-agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 9_2 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Mobile/13C75 (2079040640)' }

我的服务器代码:

  app.post('/', multer({dest:'./uploads/'}).single('upl'),(req,res) => {
    console.dir(req.headers)
    console.dir(req.body)
    res.status(204).end()
  })

在我的例子中显然没有定义“upl”。

【问题讨论】:

  • 将 cordova-plugin-file-transer 的选项 fileKey 设置为 upl
  • 我试试看。谢谢。
  • @stdob,对不起,我不太明白。基于 Multer 文档,我应该在 upl 中添加 req.file。这意味着我必须创建一个 file 对象。但是文件来自表单内的 ,如何手动创建 file 对象?
  • @stdob,它有效。谢谢。

标签: node.js express ionic-framework multer


【解决方案1】:

如果有人遇到同样的问题,这是我的完整源代码和解释。

我的项目背景

一个离子应用程序,它使用 cordova-file-transfer 插件将文件从照片库上传到 node.js express 服务器。

我在 app.js 中的服务器代码:

var express = require('express')
var multer = require('multer')
var bodyParser = require('body-parser')
var path = require('path')

var app = express()

// settings
app.set('views', path.join(__dirname,'views'))
app.set('view engine','jade')

// middleware
app.use(bodyParser.json())

// route
app.get('/', (req,res) => {
  res.render('index')
})

app.post('/', multer({dest:'./uploads/'}).single('upl'),(req,res) => {
  console.log(req.body)
  console.log(req.file)
  res.status(204).end()
})

// start
var server = app.listen(3000, () => {
  console.log('Started at port ' + server.address().port)
})

我的客户端代码upload()

upload() {

var options = new FileUploadOptions()
options.fileKey = "upl";              // this equal to <input type="file" id="upl">
options.fileName = 'test.jpg';
options.mimeType = "image/jpg";
options.chunkedMode = false;
options.params = {'directory' : 'uploads', 'fileName': 'test.jpg'};

var ft = new FileTransfer()
ft.upload(this.thumbnail, encodeURI('http://localhost:3000/'),
  (res) => {
    console.log("Code = " + res.responseCode)
    console.log("Response = " + res.response)
    console.log("Sent = " + res.bytesSent)
  },(error) => {
    alert("An error has occurred: Code = " + error.code);
    console.log("upload error source " + error.source);
    console.log("upload error target " + error.target);
  },options)
}

this.thumbnail 是我的文件路径,例如在我的 ios 中,路径类似于:

file:///Users/myusername/Library/Developer/CoreSimulator/Devices/81B513B7-AE34-4911-A9C9-57E293957BEC/data/Containers/Data/Application/C9A0BE15-EA4A-4DD8-9E75-BC960ECF50B7/tmp/ cdv_photo_016.jpg

【讨论】:

    猜你喜欢
    • 2012-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-09
    • 2011-09-12
    • 2014-11-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多