簡體   English   中英

ios10 swift3.0 Alamofire上傳圖片出錯

[英]ios10 swift3.0 Alamofire upload picture gets an error

這是我的代碼。 我想使用Alamofire上傳圖片

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
    if let imagePost = info[UIImagePickerControllerOriginalImage] as? UIImage {
        let image = imagePost
        // transform image into NSData
        let data = UIImageJPEGRepresentation(image, 0.5)
        // Home path
        let homeDirectory = NSHomeDirectory()
        let documentPath = homeDirectory + "/Documents"

        let fileManager: FileManager = FileManager.default

        do {
            try fileManager.createDirectory(atPath: documentPath, withIntermediateDirectories: true, attributes: nil)
        }
        catch let error {
            print (error)
        }
        fileManager.createFile(atPath: documentPath.appending("/image.png"), contents: data, attributes: nil)
        let filePath: String = String(format: "%@%@", documentPath, "/image.png")
        print("filePath:" + filePath)
        // Alamofire upload
        Alamofire.upload(multipartFormData: { (multipartFormData) in
            multipartFormData.append(filePath.data(using: .utf8)!, withName: "head_picture")
        }, to: URL, encodingCompletion: { response in
            picker.dismiss(animated: true, completion: nil)
            print(response)
            switch response {
            case .success(let upload, _, _):
                    upload.responseString(completionHandler: { (response) in
                        print("Success")
                        print(response)
                        print("Success")
                        self.portraitUIImageView.image = UIImage(data: data!)
                    })
            case .failure(let encodingError):
                print("error")
                print(encodingError)
            }
        })
    }
    else {
        print ("有錯誤")
    }
}

我這樣打印我的請求,網址的一部分被隱藏了

> success(request: $ curl -i \
-X POST \
-b "JSESSIONID=B4148AC39E35C599773A9A86DAE8D19F" \
-H "Content-Type: multipart/form-data; boundary=alamofire.boundary.74e3ed8f93ce9353" \
-H "Accept-Language: zh-Hans-US;q=1.0, en;q=0.9" \
-H "User-Agent: OldFriend/1.0 (MichaelHuang.OldFriend; build:1; iOS 10.3.0) Alamofire/4.4.0" \
-H "Accept-Encoding: gzip;q=1.0, compress;q=0.5" \
"http://***.**.***.200:9999/upload/head-picture.do", streamingFromDisk: false, streamFileURL: nil)

我想使用Alamofire4.0將頭像上傳到服務器。 現在我收到這樣的錯誤。 我從服務器收到消息,提示我需要提供MultipartFile參數'head_picture'。 但是我確實提供了,我該如何解決?

成功成功:HTTP狀態400 –錯誤的Requesth1 {font-family:Tahoma,Arial,sans-serif; color:white; background-color:#525D76; font-size:22px;} h2 {font-family:Tahoma,Arial, sans-serif;顏色:白色;背景顏色:#525D76;字體大小:16px;} h3 {font-family:Tahoma,Arial,sans-serif;顏色:白色;背景顏色:#525D76;字體大小:14px;}身體{font-family:Tahoma,Arial,sans-serif;顏色:黑色;背景色:白色;} b {font-family:Tahoma,Arial,sans-serif;顏色:白色;背景色:#525D76;} p {font-family:Tahoma,Arial,sans-serif; background:white; color:black; font-size:12px;} a {color:black;} a.name {color:black;} .line {height:1px; background-color:#525D76; border:none;}

HTTP狀態400 –錯誤的請求

類型狀態報告

消息必需的MultipartFile參數'head_picture'不存在

描述由於某些東西被認為是客戶端錯誤(例如,格式不正確的請求語法,無效的請求消息框架或欺騙性的請求路由),服務器無法或不會處理請求。

Apache Tomcat / 9.0.0.M18

成功

我已經使用Alamofire成功上傳了圖片,但做起來卻大不相同:

更改此代碼:

    Alamofire.upload(multipartFormData: { (multipartFormData) in
        multipartFormData.append(filePath.data(using: .utf8)!, withName: "head_picture")
    }, to: URL, encodingCompletion: { response in
        picker.dismiss(animated: true, completion: nil)
        print(response)
        switch response {
        case .success(let upload, _, _):
                upload.responseString(completionHandler: { (response) in
                    print("Success")
                    print(response)
                    print("Success")
                    self.portraitUIImageView.image = UIImage(data: data!)
                })
        case .failure(let encodingError):
            print("error")
            print(encodingError)
        }
    })

喜歡這個:

    let req = Alamofire.upload(data, to: URL, method: HTTPMethod.put, headers: nil)
    req.response { (response: DefaultDataResponse) in
        print(response)
    }

您可以嘗試使用其他方法(如post ,並在需要時發送標頭。 希望對您有幫助。

感謝Vinod Kumar,我使用了他提供的代碼

這是代碼,部分url被隱藏

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
        if let imagePost = info[UIImagePickerControllerOriginalImage] as? UIImage {
            // 修正圖片的位置
            let image = self.fixOrientation(aImage: imagePost)
            // 把圖片轉成NSData
            let data = UIImageJPEGRepresentation(image, 0.5)
            // Home目錄
            let homeDirectory = NSHomeDirectory()
            let documentPath = homeDirectory + "/Documents"
            //文件管理器
            let fileManager: FileManager = FileManager.default
            //把剛剛圖片轉換的data對象拷貝至沙盒中 並保存為image.png
            do {
                try fileManager.createDirectory(atPath: documentPath, withIntermediateDirectories: true, attributes: nil)
            }
            catch let error {
                print (error)
            }
            fileManager.createFile(atPath: documentPath.appending("/image.png"), contents: data, attributes: nil)
            let filePath: String = String(format: "%@%@", documentPath, "/image.png")

            print("filePath:" + filePath)
            // Alamofire upload
            Alamofire.upload(multipartFormData: { (multipartFormData) in
                multipartFormData.append(data!, withName: "head_picture", fileName: "my.jpeg", mimeType: "image/jpeg")
            }, to:"http://*******.200:9999/upload/head-picture.do")
            { (result) in
                switch result {
                case .success(let upload, _, _):
                    upload.uploadProgress(closure: { (Progress) in
                        picker.dismiss(animated: true, completion: nil)
                        print("Upload Progress: \(Progress.fractionCompleted)")
                    })

                    upload.responseJSON { response in
                        //self.delegate?.showSuccessAlert()
                          print(response.request)  // original URL request
                        print(response.response) // URL response
                        print(response.data)     // server data
                        print(response.result)   // result of response serialization
                        //                        self.showSuccesAlert()
                        if let JSON = response.result.value {
                            print("JSON: \(JSON)")
                        }
                    }
                    self.portraitUIImageView.image = UIImage(data: data!)
                case .failure(let encodingError):
                    //self.delegate?.showFailAlert()
                    print(encodingError)
                }
            }
        }
        else {
            print ("有錯誤")
        }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM