2016-04-04 11 views
2

Hızlı kullanarak görüntü ve video yükleme iOS uygulaması oluşturuyorum. Ağ istekleri için Alamofire kütüphanesini kullanıyorum. Kullanıcı bir görüntüye AşağıdaAlamofire tarafından gönderilen multipart/form-data isteği işleminde Swift, in Hapijs backend

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) 
     } 
    }) 
} 

Bu istek 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'); 
     } 
    } 
}); 

Sorun request.payload alamıyorum edilir işlenme şeklinden yoludur seçtiğinde Aşağıda Swift çalışır koddur Arka uçta bir akış olarak, bu yüzden bir writeStream oluşturamıyorum ve bunu writeStream'e pipetleyemiyorum. Yanlış bir şey mi yapıyorum yoksa hiçbir şey eksik mi? Verileri okumak ve dosya sistemindeki bir görüntü dosyası olarak yazmak için ne yapmalıyım?

Bu

ben cevap buldu 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/���� �"�� 
+0

Rota işleyicide 'console.log (request.payload)' dan ne elde edersiniz? Çok fazla çıktıysa soruna kesilmiş bir versiyon ekleyebiliriz. –

+0

Hey Matt .. request.payload.image dosyasında alınan verilerin başlangıç ​​bitlerini ekledim. Alınan yük büyüktür. –

cevap

0

olsun verinin başlangıç ​​olduğunu. Sadece küçük bir değişiklik gerekli. Verileri Hapi.js sonundaki gerekli biçimde almamamın nedeni, Alamofire'den düzgün bir şekilde göndermediğim için oldu.

Bu istek 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) 
    } 
}) 

gönderilmesi gerekir Ve yolu arka uçta ele alınmalıdır nasıl. Sadece yazdığınız dizinin oluşturulduğundan emin olun.

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); 
     }) 
    } 
} 
}); 
İlgili konular