【问题标题】:upload image using post rest call - swift & php - encoding issue使用 post rest 调用上传图像 - swift & php - 编码问题
【发布时间】:2018-01-04 09:55:08
【问题描述】:

我想使用其字符串表示上传图像以符合我的网络功能。 函数代码(这个很好用)

func uploadItemPict(itemdata:String, itempicture:String, completion:     @escaping (AsyncResult<Any>)->())
{
    let myUrl = URL(string: urlAPIServer);
    var request = URLRequest(url:myUrl!)
    request.httpMethod = "POST"// Compose a query string
    var postString : String
    postString = "id="
    postString += itemdata
    postString += "&ip="
    postString += itempicture
    postString += "&cmd=uploadItemPicture"

    request.httpBody = postString.data(using: String.Encoding.utf8)

    let session = URLSession.shared
    let task = session.dataTask(with: request as URLRequest){
        (data, response, error) -> Void in
        if let error = error
        {
            completion(AsyncResult.Failure(error as NSError?))
        } else {
            //let responseString = NSString(data: data!, encoding: String.Encoding.utf8.rawValue)
            //print("*********response data = \(String(describing: responseString))")
            //completion(AsyncResult.Success(responseString as Any))
            if let data = data {
                var json = try? JSONSerialization.jsonObject(with: data, options: [])
                if(json != nil) {
                    print(json!)
                    completion(AsyncResult.Success(json as Any))
                }
                else {
                    json = "{\"cmd\":\"uploadItemPict\",\"success\":\"false\",\"message\":\"wrong result: check if debug on on ws\"}"
                    print(json!)
                    let myerror = NSError(domain: "com.error.ws", code: 0, userInfo: [NSLocalizedDescriptionKey : "Wrong data from website"])
                    completion(AsyncResult.Failure(myerror as NSError?))
                }
            }
        }
    }
    task.resume()
}

获取图片字符串的代码如下:

    @IBAction func sendToto() {
    guard let url = Bundle.main.path(forResource: "toto", ofType: "jpg")
    else {
        // File Error
        print ("File reading error")
        return
    }
    let imageIn64String = UIImageJPEGRepresentation(UIImage(contentsOfFile: url)!, 0.7)?.base64EncodedString(options: .endLineWithLineFeed)
    if(isInternetAvailable()) {
        NSLog("internet available")
        uploadItemPict(itemdata: imageIn64String!, itempicture: "titi.jpg") {
            (result) in
            switch result
            {
            case .Success(let result):
                print("->success")
                break
            case .Failure(let error):
                print("->not a success")
                break
            }
        }
    }
}

我在 php 端有效地得到了一个字符串。 我的 imagecreatefromstring 方法出错,所以我决定在服务器端上传 toto.jpg 并获取本地字符串,base64encoded 以比较两个字符串:

$itemData = $this->getStringImage('id'); 
$itempicture = $this->getString('ip', 255); 
$itemDataLocal = file_get_contents("images/toto.jpg");
$itemDataLocal = base64_encode($itemDataLocal);
print($itemData);
print("<br>**************************************************<br>");
//print($itemDataGot);
//print("<br>**************************************************<br>");
print($itemDataLocal);
$itemDataLocal = base64_decode($itemDataLocal);
$image = imagecreatefromstring($itemDataLocal);
imagejpeg($image, "images/".$itempicture, 0.7);

当我将接收到的字符串 ($itemData) 与本地 ($itemDataLocal - 用它编码然后解码,我成功地重新创建图像) 进行比较时,我得到了不同的字符串,并且无法识别从 IOS 接收到的字符串作为正确的 DATA 字符串来创建图像。

任何想法我可以做错什么?

谢谢

编辑: 我认为这是IOS中base64编码的问题,因为iOS和PHP之间的结果不同。

由于我对 UIImageJPEGRepresentation 有疑问,因此我尝试使用不同的东西:toto.jpg 在 iOS 和服务器上是完全相同的文件。在 iOS 上,我尝试了以下操作:

//Use image's path to create NSData
let url:NSURL = NSURL(string : "http://SERVER/app/images/toto.jpg")!
//Now use image to create into NSData format
let imageData:NSData = NSData.init(contentsOf: url as URL)!
let imageIn64String = imageData.base64EncodedString()
print(imageIn64String)

在这种情况下,我得到的 base64 字符串结果与我使用 php 得到的结果相同。因此我怀疑问题可能来自:UIImageJPEGRepresentation。

有什么想法吗?再次感谢

编辑2: 我得到了这个工作:

guard let url1 = Bundle.main.path(forResource: "toto", ofType: "jpg")
    else {
        // File Error
        print ("File reading error")
        return
    }

    let imageData:NSData = NSData.init(contentsOfFile:url1)!
    let imageIn64String = imageData.base64EncodedString()

用于 base64 编码字符串。该字符串包含一些“+”符号。 当我在 php 端获取字符串时,“+”消失了,因此无法重新创建图像。我正在使用它来获取字符串:

$string = $_POST[$name];

我检查了 httprequest 以确保我发送了包含“+”的字符串:

request.httpBody = postString.data(using: String.Encoding.utf8)
NSLog(String(data: request.httpBody!, encoding: String.Encoding.utf8)!)

我可以在请求中看到“+”。

我做错了什么?

【问题讨论】:

    标签: php string swift3 base64


    【解决方案1】:

    通过转义出现在参数中的 + 使其工作(根据 Rob 提供的答案:https://stackoverflow.com/a/24888789/2122773

    guard let url1 = Bundle.main.path(forResource: "toto", ofType: "jpg")
    else {
        // File Error
        print ("File reading error")
        return
    }
    
    let imageData:NSData = NSData.init(contentsOfFile:url1)!
    let imageIn64String = imageData.base64EncodedString().replacingOccurrences(of: "+", with: "%2B")
    

    【讨论】:

      猜你喜欢
      • 2015-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-17
      • 1970-01-01
      • 2018-05-19
      相关资源
      最近更新 更多