使用Alamofire和Multer上传文件

6

我正在尝试使用Alamofire从iOS上传图像数据到带有Multer的Express服务器。 req.file未定义,req.body的形式为{ file: <bytes> }。没有错误消息,但文件不会出现。这是我的代码:

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

app.use(bodyParser.json())
app.use(bodyParser.urlencoded({ extended: false }))

app.post('/api/photos/upload', function(req, res) {
    var upload = multer({ dest: 'public/images/content/'}).single('file')
    upload(req, res, function(err) {
        if (err) {
            console.log("Error uploading file: " + err)
            return
        }

        // req.file = req.body
        console.log(req.body) // form fields
        console.log(req.file) // form file
    })

    res.json('yeah')
})

在iOS上:

let url = fullURL("api/photos/upload")

Alamofire.upload(.POST, url, multipartFormData: { multipartFormData in

        if let image = image {
            if let imageData = UIImageJPEGRepresentation(image, 0.5) {
                multipartFormData.appendBodyPart(data: imageData, name: "file")
            }
        }

        }, encodingCompletion: { encodingResult in

            switch encodingResult {
            case .Success(let upload, _, _):
                upload.responseJSON { response in

                    switch response.result {
                    case .Success:
                        print("success")
                    case .Failure(let error):
                        print(error)
                    }

                }
            case .Failure(let encodingError):
                print(encodingError)
            }

    })

这让我困惑了好几个小时,非常感谢您的帮助!
更新: 一个HTML表单通过Express端点可以正常工作,所以这绝对是Alamofire发送请求的问题。我尝试了许多使用Alamofire上传的示例,但它们都发送相同的错误请求。一定有一种方法可以使用Alamofire发送与HTML表单相同的请求。
另一个更新: 现在我只是使用busboy-connect,它运行良好,并且具有更多的灵活性。
3个回答

10

我刚刚成功地让它工作了。原来你必须使用Alamofire指定fileName和mimeType,以便让multer在服务器端接收上传。因此,添加图片的代码应该像这样:

if let image = image {
    if let imageData = UIImageJPEGRepresentation(image, 0.5) {
        multipartFormData.appendBodyPart(data: imageData, name: "file", fileName: "fileName.jpg", mimeType: "image/jpeg")
    }
}

当使用BUSBOY而不是Multer时,同样适用。如果没有文件名,busboy将不会触发其“file”事件。 - DccBr

0
你知道吗,方法multipartFormData.append(value.data, withName: name, fileName: filename, mimeType: mimeType) 和 multipartFormData.append(value.data, withName: key) 之间是有区别的。
当你使用前者时,multer会将其作为 req.file 处理,而使用后者则作为 req.body。

0

你的问题很可能是由于没有将multer用作中间件引起的:

var upload = multer({ dest: 'public/images/content/'})

app.post('/api/photos/upload', upload.single('file'), function(req, res) {
  // req.file should be populated now
})

在 Express 中,您可以添加任意数量的中间件:
app.post('/path',
  middleware1,
  middleware2,
  middleware3,
  ...,
  function(req, res) {
    // All middlewares has been executed
  })

我尝试了这个,结果也是一样的 :/ 有其他建议吗?谢谢。 - noizybrain

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接