简体   繁体   English

如何在 Alamofire 中以多部分形式上传大文件?

[英]How to upload large files with multipart form in Alamofire?

I am trying to upload two images (10MB and 1MB size) in a POST method with multipart form.我正在尝试以多部分形式的POST方法上传两张图片(10MB 和 1MB 大小)。

Using Alamofire upload method this way.以这种方式使用Alamofire上传方法。

AF.upload(multipartFormData: { multipartFormData in
multipartFormData.append(InputStream(data: imageMedia.data), // 10MB data
                         withLength: UInt64(imageMedia.data.count),
                         name: imageMedia.type.rawValue,
                         fileName: imageMedia.filename,
                         mimeType: imageMedia.mimeType)

multipartFormData.append(InputStream(data: maskMedia.data), // 1MB data
                         withLength: UInt64(maskMedia.data.count),
                         name: maskMedia.type.rawValue,
                         fileName: maskMedia.filename,
                         mimeType: maskMedia.mimeType)
}, with: request).responseData { afDataResponse in
    switch afDataResponse.result {
    case .success(let data):
        completion(data)
    case .failure(let error):
        print("error with alamofire response \(error.localizedDescription)")
        completion(nil)
    }
}

It goes into the failure and prints:它进入故障并打印:

error with alamofire response: URLSessionTask failed with error: The operation couldn't be completed. alamofire 响应错误:URLSessionTask 失败,错误:操作无法完成。 Message too long消息太长

Same POST request on Postman works fine so it's not a server issue. Postman 上的相同POST请求工作正常,因此这不是服务器问题。 What is a solution to this?有什么解决办法?

EDIT: With smaller images (5MB and 1MB) everything works fine.编辑:使用较小的图像(5MB 和 1MB)一切正常。

EDIT 2 : This is the error :编辑 2 :这是错误

sessionTaskFailed(error: Error Domain=NSPOSIXErrorDomain Code=40 "Message too long" UserInfo={_NSURLErrorFailingURLSessionTaskErrorKey=LocalUploadTask <8F7404DD-2947-4B18-9F23-C23F0483F440>.<1>, _kCFStreamErrorDomainKey=1, NSErrorPeerAddressKey=<CFData 0x600001068280 [0x1b9553c60]>{length = 16, capacity = 16, bytes = 0x100201bbd8ef26350000000000000000}, _kCFStreamErrorCodeKey=40, _NSURLErrorRelatedURLSessionTaskErrorKey=( "LocalUploadTask <8F7404DD-2947-4B18-9F23-C23F0483F440>.<1>" )}) sessionTaskFailed(error: Error Domain=NSPOSIXErrorDomain Code=40 "Message too long" UserInfo={_NSURLErrorFailingURLSessionTaskErrorKey=LocalUploadTask <8F7404DD-2947-4B18-9F23-C23F0483F440>.<1>, _kCFStreamErrorDomainKey=1, NSErrorPeerAddressKey=<CFData 0x600001068280 [0x1b9553c60] >{长度= 16,容量= 16,字节= 0x100201bbd8ef26350000000000000000},_kCFStreamErrorCodeKey=40,_NSURLErrorRelatedURLSessionTaskErrorKey=(“LocalUploadTask <8F7404DD-2947-4B18-9F23-C23F0483<1>F440>)”

try this to upload all size of images or videos试试这个上传所有尺寸的图像或视频

func upload(){
   let URL = "\(Constants.baseURL)\(path)"
   let _headers : HTTPHeaders = ["lang" : "language".localized(),"Content-Type": "application/json","jwt" : AuthManager.authKey()]
 var params : [String : Any] = [:]
 AF.upload(multipartFormData: { [self] (multipartFormData) in
    for (key, value) in params {
        multipartFormData.append("\(value)".data(using: String.Encoding.utf8)!, withName: key as String)
    }
    let timestamp = NSDate().timeIntervalSince1970
    multipartFormData.append(self.VideoFileData, withName: "url", fileName:  "\(Date().timeIntervalSince1970).mp4", mimeType: "video/mp4")
    
}, to: URL, method: .post, headers: _headers).responseJSON{ [self] (response) in
    switch response.result{
    case .success(let upload):
            do {
                self.loadingView.hide()
                let Lists = try JSONDecoder().decode(StoreDataVideoModel.self, from: response.data!)
                print(Lists)
                if(Lists.status == 200){
                    
                }else{
                    
                }
            } catch let error{
                self.requestStatus(code: -1, Msg: "\(error.localizedDescription)")
            }
            if response.error != nil{
                self.requestStatus(code: -1, Msg: "\(response.error?.localizedDescription ?? "")")
                return
            }
        case .failure(let error):
            print("Error in upload: \(error.localizedDescription)")
            print("wrong")
            self.requestStatus(code: -1, Msg: "\(error.localizedDescription)")
        }
}.uploadProgress(queue: .main, closure: { progress in
    //Current upload progress of file
    print("Upload Progress: \(progress.fractionCompleted)")
})

} }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM