UIImagePNGRepresentation 会导致 HTTP 错误 403



我今天有一个非常特别的问题。我在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: "--%@rn", boundary).dataUsingEncoding(NSUTF8StringEncoding)!)
    body.appendData(NSString(format: "Content-Disposition: form-data; name="image-name"rnrn").dataUsingEncoding(NSUTF8StringEncoding)!)
    body.appendData("yay".dataUsingEncoding(NSUTF8StringEncoding)!)
    body.appendData(NSString(format: "--%@rn", boundary).dataUsingEncoding(NSUTF8StringEncoding)!)
    body.appendData(NSString(format: "Content-Type: image/pngrn").dataUsingEncoding(NSUTF8StringEncoding)!)
    body.appendData(NSString(format: "Content-Transfer-Encoding: binaryrn").dataUsingEncoding(NSUTF8StringEncoding)!)
    body.appendData(NSString(format: "Content-Disposition: form-data; name="profile-img"; filename="profile.png"rnrn").dataUsingEncoding(NSUTF8StringEncoding)!)
    body.appendData(NSData(data: UIImagePNGRepresentation(image)))
    //println(NSData(data: UIImagePNGRepresentation(image)))
    body.appendData(NSString(format: "--%@rn", 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);*/
?>

您可能没有构造 PHP 正确解码的 MIME 多部分提交。这些的规格在这里。

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

相关内容

  • 没有找到相关文章

最新更新