首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >UIImagePNGRepresentation导致HTTP错误403

UIImagePNGRepresentation导致HTTP错误403
EN

Stack Overflow用户
提问于 2015-02-02 01:14:42
回答 1查看 264关注 0票数 1

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

代码语言:javascript
复制
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‘,如下所示。

代码语言:javascript
复制
if(isset($_FILES['profile-img'])) {
    $arr = ['data': 'true'];
} else {
    $arr = ['data': 'false'];
}

echo json_encode($arr);

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

注释掉body.appendData(NSData(data: UIImagePNGRepresentation(image)))允许连接工作。

是什么导致了这一切?我已经试过了我能想到的一切。

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

代码语言:javascript
复制
<?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);*/

?>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-02-02 02:44:59

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

  1. 每个标头行后面必须有一个CRLF序列。您可以通过用\r\n结束头字符串来实现这一点。在最后的标题行之后和每个部分中的数据之前,应该有一个额外的CRLF序列。
  2. 您的二进制部分(文件)没有指定编码。默认情况下,规范假定为"7BIT“编码,而原始二进制不是该编码的子集。尝试将头Content-Transfer-Encoding: binary添加到此部分。
  3. 不一定是一个问题,但边界字符串通常是一个较长的字符串,包括一串随机字符,以避免与任何实际数据发生冲突。你的短星号序列对此并不特别强烈。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28269874

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档