Swift3 使用Alamofire将图像上载到服务器
这是我的代码,我想上传图像到服务器使用,它没有错误,但它不能推图像到服务器。我该怎么办Swift3 使用Alamofire将图像上载到服务器,swift3,alamofire,Swift3,Alamofire,这是我的代码,我想上传图像到服务器使用,它没有错误,但它不能推图像到服务器。我该怎么办 let url = URL(string: urlString)! var urlRequest = URLRequest(url: url) urlRequest.httpMethod = "POST" let parameters = ["name": rname] do { urlRequest.httpBody = try JSONSerialization.data(withJSONOb
let url = URL(string: urlString)!
var urlRequest = URLRequest(url: url)
urlRequest.httpMethod = "POST"
let parameters = ["name": rname]
do {
urlRequest.httpBody = try JSONSerialization.data(withJSONObject: parameters, options: [])
} catch {
print(error)
}
urlRequest.setValue("application/json", forHTTPHeaderField: "Content-Type")
let image = UIImage.init(named: "myImage")
let imgData = UIImageJPEGRepresentation(image!, 0.2)!
Alamofire.upload(multipartFormData: { MultipartFormData in
MultipartFormData.append(imgData, withName: "fileset", fileName: "name", mimeType: "image/jpg")
},with: urlRequest,encodingCompletion: { encodingResult in
switch encodingResult {
case .success(let upload, _, _):
upload.responseJSON { response in
if let info = response.result.value as? Dictionary<String, AnyObject> {
if let links = info["links"] as? Dictionary<String, AnyObject> {
if let imgLink = links["image_link"] as? String {
print("LINK: \(imgLink)")
}
}
}
} case .failure(let error):
print(error)
}
})
let url=url(string:urlString)!
var urlRequest=urlRequest(url:url)
urlRequest.httpMethod=“POST”
let参数=[“name”:rname]
做{
urlRequest.httpBody=尝试JSONSerialization.data(使用JSONObject:parameters,options:[])
}抓住{
打印(错误)
}
urlRequest.setValue(“应用程序/json”,用于HttpHeaderField:“内容类型”)
让image=UIImage.init(名为:“myImage”)
让imgData=uiImageJPEG表示法(image!,0.2)!
上传(multipartFormData:{multipartFormData-in-in
MultipartFormData.append(imgData,名称:“fileset”,文件名:“name”,mimeType:“image/jpg”)
},with:urlRequest,encodingCompletion:{encodingResult in
开关编码结果{
成功案例(让我们上传,,u):
upload.responseJSON{中的响应
如果let info=response.result.value作为字典{
如果让links=info[“links”]作为字典{
如果让imgLink=links[“image\u link”]作为字符串{
打印(“链接:\(imgLink)”)
}
}
}
}案例。失败(let错误):
打印(错误)
}
})
尝试下面的代码
let image = UIImage.init(named: "myImage")
let imgData = UIImageJPEGRepresentation(image!, 0.2)!
let parameters = ["name": rname] //Optional for extra parameter
Alamofire.upload(multipartFormData: { multipartFormData in
multipartFormData.append(imgData, withName: "fileset",fileName: "file.jpg", mimeType: "image/jpg")
for (key, value) in parameters {
multipartFormData.append(value.data(using: String.Encoding.utf8)!, withName: key)
} //Optional for extra parameters
},
to:"mysite/upload.php")
{ (result) in
switch result {
case .success(let upload, _, _):
upload.uploadProgress(closure: { (progress) in
print("Upload Progress: \(progress.fractionCompleted)")
})
upload.responseJSON { response in
print(response.result.value)
}
case .failure(let encodingError):
print(encodingError)
}
}
需要指定
名称、文件名、mimeType
,这些对许多服务器都很重要
func upload(image: UIImage, completion: (URL?) -> Void) {
guard let data = UIImageJPEGRepresentation(image, 0.9) else {
return
}
Alamofire.upload(multipartFormData: { (form) in
form.append(data, withName: "file", fileName: "file.jpg", mimeType: "image/jpg")
}, to: "https://yourawesomebackend.com", encodingCompletion: { result in
switch result {
case .success(let upload, _, _):
upload.responseString { response in
print(response.value)
}
case .failure(let encodingError):
print(encodingError)
}
})
}
尝试下面的代码进行多页上传。@Saurabh询问。
但是最好是一个一个上传,而不是一次上传所有内容。
因为如果失败,它将只在1个映像上失败。但一次上载所有文件。如果1个文件失败,用户需要从头开始重新启动上载过程。
不过,如果您想一次上传多个数据,这里是您必须做的事情。
let image1 = UIImage.init(named: "myImage1")
let image2 = UIImage.init(named: "myImage2")
let image3 = UIImage.init(named: "myImage3")
let image4 = UIImage.init(named: "myImage4")
let imgData1 = UIImageJPEGRepresentation(image!, 0.2)!
let imgData2 = UIImageJPEGRepresentation(image!, 0.2)!
let imgData3 = UIImageJPEGRepresentation(image!, 0.2)!
let imgData4 = UIImageJPEGRepresentation(image!, 0.2)!
let parameters = ["name": rname] //Optional for extra parameter
Alamofire.upload(multipartFormData: { multipartFormData in
//loop this "multipartFormData" and make the key as array data
multipartFormData.append(imgData1, withName: "fileset[0]",fileName: "file.jpg", mimeType: "image/jpg")
multipartFormData.append(imgData2, withName: "fileset[1]",fileName: "file.jpg", mimeType: "image/jpg")
multipartFormData.append(imgData3, withName: "fileset[2]",fileName: "file.jpg", mimeType: "image/jpg")
multipartFormData.append(imgData4, withName: "fileset[3]",fileName: "file.jpg", mimeType: "image/jpg")
for (key, value) in parameters {
multipartFormData.append(value.data(using: String.Encoding.utf8)!, withName: key)
} //Optional for extra parameters
},
to:"mysite/upload.php")
{ (result) in
switch result {
case .success(let upload, _, _):
upload.uploadProgress(closure: { (progress) in
print("Upload Progress: \(progress.fractionCompleted)")
})
upload.responseJSON { response in
print(response.result.value)
}
case .failure(let encodingError):
print(encodingError)
}
}
注意:multipartFormData正在使用append,这意味着它是一个请求数组。如果需要,您可以循环并附加更多内容。好的,兄弟,我将此代码与Swift 4和Alamofire一起使用
user_photo is key for dic
swift_file.jpg is value for value
Write the same withName is key
Write the same fileName is value
call the UploadImage(Image)
func UploadImage(img:UIImage) {
let urlfinal = “ananda.profile.php";
let parameters = ["user_id":"531", "user_photo”: "swift_file.jpg"]
Alamofire.upload(multipartFormData: { (multipartFormData) in
multipartFormData.append(UIImageJPEGRepresentation(img, 1)!, withName: "user_photo", fileName: "swift_file.jpeg", mimeType: "image/jpg")
for (key, value) in parameters {
multipartFormData.append(value.data(using: String.Encoding.utf8)!, withName: key)
}
print(multipartFormData)
}, to:urlfinal)
{ (result) in
switch result {
case .success(let upload, , ):
upload.uploadProgress(closure: { (progress) in
})
upload.responseJSON { response in
print(response)
}
case .failure( _): break
}
}
}
import Foundation
import Alamofire
class UploadImageController: NSObject {
// MARK: - shared
static let shared = UploadImageController()
// MARK: - init
let decoder = JSONDecoder()
// MARK: - uploadImageOnly
func uploadImageWith(endUrl: String, photo: UIImage?, parameters: [String : Any]?, headers: HTTPHeaders?, completion: @escaping (_ success: Bool, _ uploadImageResponse: UploadImageResponse?) -> Void ) {
Alamofire.upload(multipartFormData: { (multipartFormData) in
if let data = UIImageJPEGRepresentation(photo!, 0.5) {
multipartFormData.append(data, withName: "invoice", fileName: "invoice.jpeg", mimeType: "invoice/jpeg")
}
}, usingThreshold: SessionManager.multipartFormDataEncodingMemoryThreshold, to: endUrl, method: .post, headers: headers) { (result) in
switch result {
case .failure(let error):
print("UploadImageController.requestWith.Alamofire.usingThreshold:", error)
completion(false, nil)
case .success(request: let upload, streamingFromDisk: _, streamFileURL: _):
upload.uploadProgress(closure: { (progress) in
print("Upload Progress: \(progress.fractionCompleted)")
})
upload.responseJSON(completionHandler: { (response) in
switch response.result {
case .failure(let error):
print("UploadImageController.requestWith.Alamofire.upload.responseJSON:", error)
completion(false, nil)
case .success( _):
print("UploadImageController.requestWith.Alamofire.upload.responseJSON Succes")
guard let data = response.data else { return }
do {
let uploadImageResponse = try self.decoder.decode(UploadImageResponse.self, from: data)
completion(true, uploadImageResponse)
} catch let jsonError {
print("Error serializing json.ProfileController.getProfile:", jsonError)
completion(false, nil)
}
}
})
}
}
}
// MARK: - uploadImageWithParameters
func uploadImageWithParametersAnd(endUrl: String, photo: UIImage?, parameters: [String : Any]?, headers: HTTPHeaders?, completion: @escaping (_ success: Bool, _ addInvoiceResponse: AddInvoiceResponse?) -> Void ) {
Alamofire.upload(multipartFormData: { (multipartFormData) in
if let data = UIImageJPEGRepresentation(photo!, 0.5) {
multipartFormData.append(data, withName: "invoicePicture", fileName: "invoicePicture.jpeg", mimeType: "invoice/jpeg")
}
for (key, value) in parameters! {
multipartFormData.append("\(value)".data(using: String.Encoding.utf8)!, withName: "\(key)")
}
}, usingThreshold: SessionManager.multipartFormDataEncodingMemoryThreshold, to: endUrl, method: .post, headers: headers) { (result) in
switch result {
case .failure(let error):
print("UploadImageController.requestWith.Alamofire.usingThreshold:", error)
completion(false, nil)
case .success(request: let upload, streamingFromDisk: _, streamFileURL: _):
upload.uploadProgress(closure: { (progress) in
print("Upload Progress: \(progress.fractionCompleted)")
})
upload.responseJSON(completionHandler: { (response) in
switch response.result {
case .failure(let error):
print("UploadImageController.requestWith.Alamofire.upload.responseJSON:", error)
completion(false, nil)
case .success( _):
print("UploadImageController.requestWith.Alamofire.upload.responseJSON Succes")
guard let data = response.data else { return }
do {
let addInvoiceResponse = try self.decoder.decode(AddInvoiceResponse.self, from: data)
completion(true, addInvoiceResponse)
} catch let jsonError {
print("Error serializing json.ProfileController.getProfile:", jsonError)
completion(false, nil)
}
}
})
}
}
}
}
例如,此附加OICEResponse
import Foundation
struct AddInvoiceResponse: Decodable {
let id, message: String?
}
import Foundation
struct UploadImageResponse: Codable {
let id, message: String?
}
let fileURL = Bundle.main.url(forResource: "video", withExtension: "mov")
AF.upload(fileURL, to: "https://httpbin.org/post").responseJSON { response in
debugPrint(response)
}
这里上传ImageResponse
import Foundation
struct AddInvoiceResponse: Decodable {
let id, message: String?
}
import Foundation
struct UploadImageResponse: Codable {
let id, message: String?
}
let fileURL = Bundle.main.url(forResource: "video", withExtension: "mov")
AF.upload(fileURL, to: "https://httpbin.org/post").responseJSON { response in
debugPrint(response)
}
let url=BaseViewController.API\u url+“上传”
将image=info[UIImagePickerControllerEditedImage]设为?UIImage
让imgData=uiImageJPEG表示法(image!,0.2)!
设参数=[
“userId”:UserDefaults.standard.value(forKey:“userId”)!
]
上传(multipartFormData:{multipartFormData-in-in
multipartFormData.append(imgData,名称:“uload_data”,文件名:“file.jpg”,mimeType:“image/jpg”)
用于参数中的(键、值){
multipartFormData.append((值为AnyObject).data(使用:String.Encoding.utf8.rawValue)!,with name:key)
}//对于额外参数,可选
},
收件人:url)
(结果)
切换结果{
成功案例(让我们上传,,u):
uploadProgress(闭包:{(进度)在
打印(“上载进度:\(Progress.fractionCompleted)”)
})
upload.responseJSON{中的响应
self.objHudHide()
打印(响应.结果.值)
让jsonDict:NSDictionary=response.result.value为!NSDictionary
印刷品(jsonDict)
如果jsonDict[“状态”]为!字符串==“成功”
{
让detailDict:Dictionary=jsonDict[“detail”]as!Dictionary
如果让getTotalPrice=detailDict[“总价”]
{
self.lblTotalPrice.text=“$\(getTotalPrice)+免费送货”
}
如果让getTotalSize=detailDict[“总上传大小”]
{
self.lblTotalSize.text=“总大小:\(getTotalSize)”
}
}
其他的
{
让alertViewController=UIAlertController(标题:NSLocalizedString(“警报!”,注释:“”),消息:“出现问题,请重试。”,首选样式:。警报)
让okAction=UIAlertAction(标题:NSLocalizedString(“确定”,注释:),样式:。默认值){(操作)->中的Void
}
alertViewController.addAction(okAction)
self.present(alertViewController,动画:true,完成:nil)
}
}
案例失败(let encodingError):
打印(编码错误)
}
}
目前唯一为我工作的人:
let headers: HTTPHeaders = [
/* "Authorization": "your_access_token", in case you need authorization header */
"Content-type": "multipart/form-data"
]
AF.upload(
multipartFormData: { multipartFormData in
multipartFormData.append(imageOrVideo!.jpegData(compressionQuality: 0.5)!, withName: "upload_data" , fileName: "file.jpeg", mimeType: "image/jpeg")
},
to: "http://35.227.31.145/new.php", method: .post , headers: headers)
.response { resp in
print(resp)
}
将代码更新为Swift 5 在swift 5中,这一行发生了变化
let imageData = UIImageJPEGRepresentation(image!, 0.2)!
喜欢这个
let imageData = image.jpegData(compressionQuality: 0.50)
上传图片的完整代码
let param: [String:Any] = ["your_parameters"]
var image = UIImage()
image = UIImage(named: "edit.png")!
let imageData = image.jpegData(compressionQuality: 0.50)
print(image, imageData!)
AF.upload(multipartFormData: { (multipartFormData) in
multipartFormData.append(imageData!, withName: "file", fileName: "swift_file.png", mimeType: "image/png")
for (key, value) in param {
multipartFormData.append("\(value)".data(using: String.Encoding.utf8)!, withName: key)
}
}, to: "your_url")
{ (result) in
switch result {
case .success(let upload, _, _):
upload.uploadProgress(closure: { (progress) in
//Print progress
print("uploading \(progress)")
})
upload.responseJSON { response in
//print response.result
}
case .failure( _): break
//print encodingError.description
}
}
}
考虑到Alamofire 5.0+: 上传数据
let data = Data("data".utf8)
AF.upload(data, to: "https://httpbin.org/post").responseJSON { response in
debugPrint(response)
}
AF.upload(multipartFormData: { multipartFormData in
multipartFormData.append(Data("one".utf8), withName: "one")
multipartFormData.append(Data("two".utf8), withName: "two")
}, to: "https://httpbin.org/post")
.responseJSON { response in
debugPrint(response)
}
上传文件
import Foundation
struct AddInvoiceResponse: Decodable {
let id, message: String?
}
import Foundation
struct UploadImageResponse: Codable {
let id, message: String?
}
let fileURL = Bundle.main.url(forResource: "video", withExtension: "mov")
AF.upload(fileURL, to: "https://httpbin.org/post").responseJSON { response in
debugPrint(response)
}
上传多部分表单数据
let data = Data("data".utf8)
AF.upload(data, to: "https://httpbin.org/post").responseJSON { response in
debugPrint(response)
}
AF.upload(multipartFormData: { multipartFormData in
multipartFormData.append(Data("one".utf8), withName: "one")
multipartFormData.append(Data("two".utf8), withName: "two")
}, to: "https://httpbin.org/post")
.responseJSON { response in
debugPrint(response)
}
通过多部分形式生成的图像:
我在用Alamofire 5上传图像文件时遇到了一些问题。 我的解决方案如下所示:
let parameters: [String: String] = ["user_id": "1"]
AF.upload(multipartFormData: { multipartFormData in
for (key, value) in parameters {
multipartFormData.append(value.data(using: .utf8)!, withName: key)
}
if let jpegData = UIImageJPEGRepresentation(image, 1.0) {
multipartFormData.append(jpegData, withName: "image", fileName: "image", mimeType: "image/jpeg")
}
}, to: "http://example.com/upload-image")
.authenticate(username: "username", password: "password") // had basic auth
.response { response in
if response.response?.statusCode == 200 {
print("OK. Done")
}
}
在对上面的版本进行了一些快速清理之后,这个代码段就是我一直重复使用的代码段,其中
Endpoints.uploadProfileImage()
就是url
func uploadPhoto(media: UIImage,params: [String:String],fileName: String){
let headers: HTTPHeaders = [
"Content-type": "multipart/form-data"
]
AF.upload(
multipartFormData: { multipartFormData in
multipartFormData.append(media.jpegData(
compressionQuality: 0.5)!,
withName: "upload_data",
fileName: "\(fileName).jpeg", mimeType: "image/jpeg"
)
for param in params {
let value = param.value.data(using: String.Encoding.utf8)!
multipartFormData.append(value, withName: param.key)
}
},
to: Endpoints.uploadProfileImage(),
method: .post ,
headers: headers
)
.response { response in
print(response)
}
}
什么是
rname
?在let parameters=[“name”:rname]
@JeffMuir中,本教程不包括this@iosMentalist这是真的。我只是想分享一个如何使用它的例子。上有多部分表单数据的详细说明。从这些信息得出的结论是,“名称”和rname是可选的。它仅用于在单独的参数中共享有关文件的更多数据。它们可以是你想要的任何东西。这取决于服务器需要什么。密钥“name”可能不是密钥的最佳名称。只发送文件就可以了。我的项目做得很好