[CẢNH BÁO]
Như tôi nhìn thấy rằng câu hỏi này là nhận được chú ý hơn nó nên, Tôi muốn nói với bạn không nên sử dụng bất kỳ mã sau.
Vào thời điểm tôi hỏi câu hỏi, Swift đã ít hơn một năm, đang chuyển động nhanh, hầu hết các thư viện đều không thân thiện với Swift và không ổn định. Tôi khuyên bạn nên thử sử dụng Alamofire hoặc một thư viện khác cho loại nhiệm vụ đó. Nhưng đừng tự làm. [/ WARNING]tải lên một hình ảnh và thông số với multipart/form-data trong Swift
Tôi muốn tải hình ảnh lên điểm cuối Drupal.
Vấn đề tôi gặp phải là tôi nhận được phản hồi HTTP 200 OK với loại nội dung văn bản/html. Trong phản hồi HTML, có một thông báo rõ ràng rằng nút đã được tạo chính xác. Nhưng ở phía máy chủ, hình ảnh không được liên kết với nút.
Ngoài ra tôi không mong đợi văn bản/html nhưng ứng dụng/json khi tôi chỉ định nó trong tiêu đề Chấp nhận.
Nó đã hoạt động trong ứng dụng Android sử dụng Mẫu phần còn lại của Android. Đây là đoạn mã để tham khảo:
String url = getUrl("node/{info_id}/attach_file");
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.MULTIPART_FORM_DATA);
if (user.isLoggedIn()) {
headers.add(user.getSessionName(), user.getSessionId());
headers.add("X-CSRF-Token", user.getToken());
headers.add("Cookie", user.getSessionName() + "=" + user.getSessionId());
}
MultiValueMap<String, Object> parts = new LinkedMultiValueMap<>();
parts.add("files[field_mobileinfo_image]",
new FileSystemResource(info.getImageUri()));
parts.add("field_name", "field_mobileinfo_image");
HttpEntity<MultiValueMap<String, Object>> request = new HttpEntity<>(parts, headers);
return getRestTemplate().exchange(url, HttpMethod.POST, request, Void.class, info.getId()).getBody();
Tôi biết tôi không kiểm tra phản ứng trong Android (Void.class
) nhưng tất cả mọi thứ hoạt động tốt và hình ảnh được gắn vào nút ở phía máy chủ.
Bây giờ trên iOS trong Swift, tôi đã thử nhiều thứ.
Với AFNetworking:
func upload(mobileInfo: MobileInfo) {
let user = userService.load()
let url = Config.buildUrl("")
let manager = AFHTTPRequestOperationManager(baseURL: NSURL(string:url)!)
let serializer = AFHTTPRequestSerializer()
serializer.setValue(user.sessionId, forHTTPHeaderField: user.sessionName)
serializer.setValue(user.token, forHTTPHeaderField: "X-CSRF-Token")
serializer.setValue("\(user.sessionName)=\(user.sessionId)", forHTTPHeaderField: "Cookie")
manager.requestSerializer = serializer
manager.responseSerializer.acceptableContentTypes.removeAll(keepCapacity: false)
manager.responseSerializer.acceptableContentTypes.insert("application/json")
let imageData = UIImageJPEGRepresentation(mobileInfo.image, 0.3)
manager.POST("/node/\(mobileInfo.id)/attach_file", parameters: nil, constructingBodyWithBlock: { (formData) -> Void in
formData.appendPartWithFileData(
imageData,
name: "files[field_mobileinfo_image]",
fileName: "field_mobileinfo_image",
mimeType: "image/jpeg")
formData.appendPartWithFormData("field_mobileinfo_image".dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true), name: "field_name")
},
success: { (operation, data) -> Void in
println(data)
}) { (operation, error) -> Void in
println(error)
}
}
thủ với thông tin nắm lấy từ câu hỏi stackoverflow khác:
func upload2(mobileInfo: MobileInfo) {
let user = userService.load()
let imageData = UIImageJPEGRepresentation(mobileInfo.image, 0.3)
let url = NSURL(string:Config.buildUrl("/node/\(mobileInfo.id)/attach_file"))!
println(url)
var request = NSMutableURLRequest(URL: url)
var session = NSURLSession.sharedSession()
request.HTTPMethod = "POST"
var boundary = "---------------------------14737809831466499882746641449"
var contentType = "multipart/form-data; boundary=\(boundary)"
println(contentType)
request.addValue(contentType, forHTTPHeaderField: "Content-Type")
request.addValue("application/json", forHTTPHeaderField: "Accept")
request.addValue("\(user.sessionName)=\(user.sessionId)", forHTTPHeaderField: "Cookie")
request.addValue(user.sessionId, forHTTPHeaderField: user.sessionName)
request.addValue(user.token, forHTTPHeaderField: "X-CSRF-Token")
println(request.allHTTPHeaderFields)
var body = NSMutableData()
body.appendData("\r\n--\(boundary)\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
body.appendData("Content-Disposition: form-data; name=\"field_name\"\r\n\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
body.appendData("field_mobileinfo_image".dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true)!)
body.appendData("\r\n--\(boundary)\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
body.appendData("Content-Disposition: form-data; name=\"files[field_mobileinfo_image]\"; filename=\"img.jpg\"\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
body.appendData("Content-Type: application/octet-stream\r\n\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
body.appendData(imageData)
body.appendData("\r\n--\(boundary)\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
var returnData = NSURLConnection.sendSynchronousRequest(request, returningResponse: nil, error: nil)
var returnString = NSString(data: returnData!, encoding: NSUTF8StringEncoding)
println("returnString \(returnString)")
}
Với SRWebClient:
func upload3(mobileInfo: MobileInfo) {
let user = userService.load()
let imageData:NSData = NSData(data: UIImageJPEGRepresentation(mobileInfo.image, 0.3))
SRWebClient.POST("http://master.test.lesfrontaliers.lu/node/\(mobileInfo.id)/attach_file")
.headers(["Accept": "application/json",
user.sessionName: user.sessionId,
"X-CSRF-Token": user.token,
"Cookie": "\(user.sessionName)=\(user.sessionId)"])
.data(imageData, fieldName:"files[field_mobileinfo_image]", data:["field_name":"field_mobileinfo_image"])
.send({ (response: AnyObject!, status: Int) -> Void in
println(status)
println(response)
},failure:{(error:NSError!) -> Void in
println(error)
})
}
Hãy cứu tôi! ;-) Tôi đã thử rất nhiều điều để làm cho nó hoạt động mà tôi không thể nhìn thấy nữa nếu tôi làm điều gì đó sai trái. Nó có vẻ ok cho tôi. Sự khác biệt duy nhất tôi có thể thấy là tôi không lưu trữ hình ảnh trên hệ thống tập tin nhưng trực tiếp gửi dữ liệu nhị phân mà là cùng một điều ở cuối.
Dưới đây là một hình ảnh của yêu cầu tạo ra trong Postman (làm việc và nhận json)
[EDIT] Nếu nó có thể giúp ai đó ở đây là mã chính xác của phần sai của trên tay yêu cầu:
var body = NSMutableData()
body.appendData("--\(boundary)\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
body.appendData("Content-Disposition: form-data; name=\"field_name\"\r\n\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
body.appendData("field_mobileinfo_image\r\n".dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true)!)
body.appendData("--\(boundary)\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
body.appendData("Content-Disposition: form-data; name=\"files[field_mobileinfo_image]\"; filename=\"img.jpg\"\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
body.appendData("Content-Type: image/jpeg\r\n\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
body.appendData(imageData)
body.appendData("\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
body.appendData("--\(boundary)--\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
request.HTTPBody = body
như thế nào là điều này được thực hiện khi tôi cần phải gửi lên các thông số bài là tốt? http://stackoverflow.com/questions/30006290/uploading-image-in-swift-with-multiple-parameters – Tyler
Tại sao bạn chỉ định 'image.jpeg' nếu tệp của bạn có phần mở rộng' png'? –
Ngoài ra, tôi luôn tự hỏi hai bổ sung, dẫn dấu gạch ngang trước chuỗi ranh giới ('--') là gì. –