iOS*_*iOS 4 multipartform-data ios swift alamofire
我正在使用Alamofire将资产(图像/视频)作为多部分表单数据上传。对于小于300MB(应用程序)的文件大小,它可以正常工作。当我尝试上传大于300MB的文件时,应用崩溃。
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
}
}
Run Code Online (Sandbox Code Playgroud)
我也从Xcode收到以下消息
我如何支持使用Alamofire上传大型视频?
使用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
})
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2633 次 |
| 最近记录: |