在Hapijs后端处理由Alamofire在Swift中发送的多部分/表单数据请求

我正在使用swift创build一个图像和video上传iOS应用程序。 我正在使用Alamofire库进行networking请求。 下面是用户select图像时快速运行的代码

func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) { dismissViewControllerAnimated(true, completion: nil) guard let image = info[UIImagePickerControllerOriginalImage] as? UIImage else { print("Did not get required image") return } guard let imageData = UIImageJPEGRepresentation(image, 0.8) else { return } Alamofire.upload(.POST, "http://localhost:8101/upload_request", multipartFormData: { multipartFormData in multipartFormData.appendBodyPart(data: imageData, name: "image") }, encodingCompletion: { encodingResult in switch encodingResult { case .Success(let upload, _, _): upload.responseJSON(completionHandler: { response in debugPrint(response) }) case .Failure(let encodingError): print(encodingError) } }) } 

以下是Hapijs处理请求的方式

 server.route({ method: 'POST', path: '/upload_request', config: { payload: { maxBytes: 10 * 1024 * 1024, output: 'stream', parse: true, allow: 'multipart/form-data' } }, handler: (request, reply) => { var data = request.payload; if (data.image) { var filePath = 'new_image.jpg'; // data.image has data but is not of Stream.Readable } else { console.log('No data file'); } } }); 

问题是我没有得到request.payload.image作为后端的stream,所以我不能创build一个writeStream,并将其pipe道writeStream。 我做错了什么,或者错过了什么? 我该怎么做才能读取数据并将其写入文件系统中的映像文件?

这是我在request.payload.image中获得的数据的开始

     JFIFHH  LExifMM* i&      8Photoshop 3.08BIM8BIM%  ُ       B~  @ICC_PROFILE0ADBEmntrRGB XYZ  3;acspAPPLnone   -ADBE cprt 2desc0kwtpt bkpt rTRC gTRC bTRC rXYZ gXYZbXYZtextCopyright 2000 Adobe Systems IncorporateddescAdobe RGB (1998)XYZ  Q XYZ curv3curv3curv3XYZ  O  XYZ 4  , XYZ &1/      "   

我find了答案。 只需要很小的改变。 我之所以没有在Hapi.js上获取所需格式的数据,是因为我没有从Alamofire正确发送数据。

这是如何从Alamofire发送请求

 Alamofire.upload( .POST, "http://localhost:8101/upload_request", multipartFormData: { multipartFormData in multipartFormData.appendBodyPart(data: self.fileData, name: "image", fileName: "imageToUpload.jpg", mimeType: "image/jpeg") }, encodingCompletion: { encodingResult in switch encodingResult { case .Success(let upload, _, _): upload.responseJSON(completionHandler: { response in debugPrint(response) }) case .Failure(let encodingError): print(encodingError) } }) 

而且应该在后端处理。 只要确保您正在写入的目录已创build。

 server.route({ path: '/upload_request', method: 'POST', config: { payload: { maxBytes: 20 * 1024 * 1024, output: 'stream', parse: true, allow: 'multipart/form-data' } }, handler: (request, reply) => { var data = request.payload; if (data.image) { var name = data.image.hapi.filename; var path = __dirname + "/uploads/" + name; var file = fs.createWriteStream(path); file.on('error', (err) => { console.error(err); }); file.on('open', (err) => { data.image.pipe(file); }); data.image.on('end', (err) => { var ret = { filename: data.image.hapi.filename, headers: data.image.hapi.headers } reply(ret); }) } } });