2016-11-03 2 views
2

Я использую Alamofire для загрузки активов (изображений/видео) в виде данных с несколькими формами. Он отлично работает для файлов размером менее 300 МБ (приложение). Когда я пытаюсь загрузить файл размером более 300 МБ, приложение аварийно завершает работу.Alamofire upload огромный файл

if let video = self.avPlayerItem?.asset as? AVURLAsset { 
    if let assetData = NSData(contentsOfURL: video.URL) { 
     multipartFormData.appendBodyPart(data: assetData, name: "file", fileName: "video", mimeType: "video/mp4") // Execution stops here 
    } 
} 

Я также получаю ниже сообщение от Xcode

enter image description here

Как бы поддерживать загрузку огромных размеров видео с помощью Alamofire?

ответ

2

Используйте Stream для загрузки вместо преобразования файлов в NSData, которые приводят к проблеме с памятью и происходят сбои при загрузке огромных файлов. Код примера

if let imageUrl = info[UIImagePickerControllerReferenceURL] as? NSURL{ 
     let assetLibrary = ALAssetsLibrary() 
     assetLibrary.assetForURL(imageUrl , resultBlock: { (asset: ALAsset!) -> Void in 
      if let actualAsset = asset as ALAsset? { 
       let assetRep: ALAssetRepresentation = actualAsset.defaultRepresentation() 

       let size = assetRep.size() 
       let stream = NSInputStream(URL: assetRep.url()) 

       Alamofire.upload(
        .POST, 
        "SERVER_URL", 
        headers: [:], 
        multipartFormData: { multipartFormData in 

         multipartFormData.appendBodyPart(stream: stream!, length: UInt64(size), name: "fileparameter", fileName: "fileName", mimeType: "video/mp4") 

        }, 
        encodingCompletion: { encodingResult in 
         switch encodingResult { 
         case .Success(let upload, _, _): 
          upload.progress { bytesWritten, totalBytesWritten, totalBytesExpectedToWrite in 
           dispatch_async(dispatch_get_main_queue()) { 
            let percent = (Float(totalBytesWritten)/Float(totalBytesExpectedToWrite)) 
            print(percent) 
           } 
          } 
          upload.validate() 
          upload.responseJSON { response in 
           print(response); 
          } 
         case .Failure(let encodingError): 
          print(encodingError) 
          let error = NSError(domain: "", code: 404, userInfo: [NSLocalizedDescriptionKey: "Image Uploading Failed. Please try again."]) 
          let result = Result<AnyObject, NSError>.Failure(error) 
          let response = Response(request: nil, response: nil, data: nil, result: result) 
          print(response); 

         } 
        } 
       ) 

      } 
      }, failureBlock: { (error) -> Void in 
     }) 
    } 
Смежные вопросы