Swift,php - 无法上传图片

时间:2017-05-22 02:56:27

标签: php ios swift

我尝试使用PHP从ios应用上传图片到我的网络服务器。我有以下代码来管理上传:

func uploadImage()
    {
        // get userId from saved credentials
        let userId = UserDefaults.standard.string(forKey: "userId")

        let param = ["userId":userId]

        let imageData = UIImageJPEGRepresentation(profPicIV.image!, 1)

        if(imageData == nil )  { return }

        self.imgUploadButton.isEnabled = false

        let uploadScriptUrl = URL(string: "http://xxx.xxx.xxx.xxx/scripts/imageUpload.php")

        let boundary = generateBoundaryString()

        var request = NSMutableURLRequest(url: uploadScriptUrl!)
        request.httpMethod = "POST"

        request.httpBody = createBodyWithParameters(param as! [String : String], filePathKey: "file", imageDataKey: imageData!, boundary: boundary)

        request.setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type")

        if (profPicIV.image == nil)
        {
            return
        }


        if(imageData == nil)
        {
            return
        }

        let session = URLSession.shared


        let task = session.dataTask(with: request as URLRequest, completionHandler: {
            (
            data, response, error) in

            guard ((data) != nil), let _:URLResponse = response, error == nil else {
                print("error")
                return
            }

            if let dataString = NSString(data: data!, encoding: String.Encoding.utf8.rawValue)
            {
                print(dataString)
            }

        })


        task.resume()


    }

以及createBodyWithParameters:

func createBodyWithParameters(_ parameters: [String: String]?, filePathKey: String?, imageDataKey: Data, boundary: String) -> Data {
        let body = NSMutableData();

        if parameters != nil {
            for (key, value) in parameters! {
                body.appendString("--\(boundary)\r\n")
                body.appendString("Content-Disposition: form-data; name=\"\(key)\"\r\n\r\n")
                body.appendString("\(value)\r\n")
            }
        }

        let filename = "menu-image.jpg"

        let mimetype = "image/jpg"

        body.appendString("--\(boundary)\r\n")
        body.appendString("Content-Disposition: form-data; name=\"\(filePathKey!)\"; filename=\"\(filename)\"\r\n")
        body.appendString("Content-Type: \(mimetype)\r\n\r\n")
        body.append(imageDataKey)
        body.appendString("\r\n")



        body.appendString("--\(boundary)--\r\n")

        return body as Data
    }

}

//add appendString function
extension NSMutableData {

    func appendString(_ string: String) {
        let data = string.data(using: String.Encoding.utf8, allowLossyConversion: false)
        append(data!)
    }
}

我的网络服务器上的PHP页面如下所示:

<?php

 $user_id = $_POST["userId"];
 $target_dir = "../profPics/" . $user_id;

if(!file_exists($target_dir)) 
{  
    mkdir($target_dir, 0744, true);
} 

$target_dir = $target_dir . "/" . basename($_FILES["file"]["name"]);

if (move_uploaded_file($_FILES["file"]["tmp_name"], $target_dir)) {
    echo json_encode([
        "message" => "The file ". basename( $_FILES["file"]["name"]). " has been uploaded.",
        "status" => "OK",
    "userId" => $user_id
    ]);

} else {

    echo json_encode([
        "message" => "Sorry, there was an error uploading your picture.",
        "status" => "Error",
            "userId" => $user_id
    ]);
}

?>

然后我尝试上传图片并在控制台中打印出错误说:

{"message":"Sorry, there was an error uploading your picture.","status":"Error","userId":"6"}

正确地从我保存的登录信息中抓取userId,并成功将其发布到PHP页面,因为PHP页面在错误中返回它(userId = 6)我无法看到任何错误apache error.log。任何人都可以看到我出错的地方吗?谢谢!

0 个答案:

没有答案