代码之家  ›  专栏  ›  技术社区  ›  Jeffrey

UIImagePNGRepresentation导致HTTP错误403

  •  1
  • Jeffrey  · 技术社区  · 10 年前

    我今天有一个很特别的问题。我在iOS中创建了一个多部分/表单数据头,然后将其发送到web服务器上的PHP脚本。它只使用字符串作为数据,但当我尝试将图像附加到标头时,它返回403。以下是尝试连接的函数:

    func uploadImage(image: UIImage) {
        var url: NSURL = NSURL(string: "https://example.com/uploadPicture.php")!
        var request: NSMutableURLRequest = NSMutableURLRequest(URL: url)
    
        request.HTTPMethod = "POST"
    
        var boundary = NSString(format: "dsfghjkergsalkj")
        var contentType = NSString(format: "multipart/form-data; boundary=%@", boundary)
        request.addValue(contentType, forHTTPHeaderField: "Content-Type")
        request.timeoutInterval = 60
    
        var body = NSMutableData()
    
        body.appendData(NSString(format: "--%@\r\n", boundary).dataUsingEncoding(NSUTF8StringEncoding)!)
        body.appendData(NSString(format: "Content-Disposition: form-data; name=\"image-name\"\r\n\r\n").dataUsingEncoding(NSUTF8StringEncoding)!)
        body.appendData("yay".dataUsingEncoding(NSUTF8StringEncoding)!)
    
        body.appendData(NSString(format: "--%@\r\n", boundary).dataUsingEncoding(NSUTF8StringEncoding)!)
        body.appendData(NSString(format: "Content-Type: image/png\r\n").dataUsingEncoding(NSUTF8StringEncoding)!)
        body.appendData(NSString(format: "Content-Transfer-Encoding: binary\r\n").dataUsingEncoding(NSUTF8StringEncoding)!)
        body.appendData(NSString(format: "Content-Disposition: form-data; name=\"profile-img\"; filename=\"profile.png\"\r\n\r\n").dataUsingEncoding(NSUTF8StringEncoding)!)
        body.appendData(NSData(data: UIImagePNGRepresentation(image)))
    
        //println(NSData(data: UIImagePNGRepresentation(image)))
    
        body.appendData(NSString(format: "--%@\r\n", boundary).dataUsingEncoding(NSUTF8StringEncoding)!)
    
        request.HTTPBody = body
    
        let task = NSURLSession(configuration: .defaultSessionConfiguration(), delegate: nil, delegateQueue: NSOperationQueue.mainQueue()).dataTaskWithRequest(request) {
            data, response, error in
    
            if (error != nil) {
                println("Error Submitting Request: \(error)")
                return
            }
    
            var err: NSError?
            var userData: [String: String]!
            userData = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: &err) as? [String: String]
    
            if(userData != nil) {
                println(data)
                println(userData)
            } else {
                println(data)
                println("No data recieved.")
            }
        }
    
        task.resume()
    
    }
    

    它应该返回一个JSON关联数组,该数组在键“data”下具有“true”或“false”,如下所示。

    if(isset($_FILES['profile-img'])) {
        $arr = ['data': 'true'];
    } else {
        $arr = ['data': 'false'];
    }
    
    echo json_encode($arr);
    

    相反,它返回一个十六进制字节的长列表,这是403禁止的页面。

    发表评论 body.appendData(NSData(data: UIImagePNGRepresentation(image))) 允许连接工作。

    这可能是什么原因造成的?我想什么都试过了。

    编辑:这里是完整的PHP页面,不多。

    <?php
    
    error_reporting(E_ALL);
    ini_set('display errors', 1);
    
    if(isset($_FILES['profile-img'])) {
        $arr = ['data': 'true'];
    } else {
        $arr = ['data': 'false'];
    }
    
    echo json_encode($arr);
    
    /*$uploaddir = './uploads/';
    $file = basename($_FILES['profile_img']['name']);
    $uploadfile = $uploaddir . $file;
    
    if (move_uploaded_file($_FILES['profile_img']['tmp_name'], $uploadfile)) {
        $arr = ['data': 'true'];
    } else {
        $arr = ['data': 'false'];
    }
    
    echo json_encode($arr);*/
    
    ?>
    
    1 回复  |  直到 10 年前
        1
  •  0
  •   Ben Zotto sberry    10 年前

    您可能无法构建PHP正在正确解码的MIME多部分提交。 The spec for these is here.

    1. 每个标题行必须具有 CRLF 您可以通过在头字符串结尾使用 \r\n 。应该有额外的 CRLF公司 序列在最后的标题行之后和每个部分中的数据之前。
    2. 二进制部分(文件)没有指定编码。默认情况下,规范采用“7BIT”编码,原始二进制文件不是其子集。尝试添加标题 Content-Transfer-Encoding: binary 这一部分。
    3. 不一定是个问题,但边界字符串通常是一个较长的字符串,包括一堆随机字符,以避免与任何实际数据冲突。你的短星号序列对此不是特别强。