簡體   English   中英

UIImagePNGRepresentation導致HTTP錯誤403

[英]UIImagePNGRepresentation causes HTTP error 403

我今天有一個特別的問題。 我在iOS中創建了一個multipart / form-data標頭,然后將其發送到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()

}

它應返回在鍵“數據”下具有“ true”或“ false”的JSON關聯數組,如下所示。

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序列。 您可以通過用\\r\\n結束標題字符串來完成此操作。 在最后的標題行之后和每個部分中的數據之前,應該有一個額外的CRLF序列。
  2. 您的二進制部分(文件)未指定編碼。 默認情況下,規范采用“ 7BIT”編碼,原始二進制文件不是該子集的子集。 嘗試將標頭Content-Transfer-Encoding: binary添加到此部分。
  3. 不一定是問題,但邊界字符串通常是較長的字符串,其中包括一堆隨機字符,以避免與任何實際數據發生沖突。 您的星號短序列對此並不特別強。

暫無
暫無

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

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