从Swift上传图片到PHP服务器时出错

3
我有一个问题,尝试在Swift中上传图像到PHP服务器。一切看起来都很好,直到php处理文件。在那一刻我收到错误。
Swift代码的相关部分是:
func myImageUploadRequest(image: UIImage, realfilename: String)
{

    let myUrl = NSURL(string: "http://www.ignistudios.com/boda/postImage.php");

    let request = NSMutableURLRequest(URL:myUrl!);
    request.HTTPMethod = "POST";

    let param = [
        "firstName"  : "username",
        "lastName"    : "lastname",
        "userId"    : "9"
    ]

    let boundary = generateBoundaryString()

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


    let imageData = UIImageJPEGRepresentation(image, 1)
    print(imageData.debugDescription)

    if(imageData==nil)  { return; }

    request.HTTPBody = createBodyWithParameters(param, filePathKey: "file", realfilename: realfilename, imageDataKey: imageData!, boundary: boundary)

    let task = NSURLSession.sharedSession().dataTaskWithRequest(request) {
        data, response, error in

        if error != nil {
            print("error=\(error)")
            return
        }

        // You can print out response object
        print("******* response = \(response)")

        // Print out reponse body
        let responseString = NSString(data: data!, encoding: NSUTF8StringEncoding)
        print("****** response data = \(responseString!)")



    }

    task.resume()

}


func createBodyWithParameters(parameters: [String: String]?, filePathKey: String?, realfilename: String?, imageDataKey: NSData, boundary: String) -> NSData {
    var 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 = realfilename

    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.appendData(imageDataKey)
    body.appendString("\r\n")



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

    return body
}




func generateBoundaryString() -> String {
    return "Boundary-\(NSUUID().UUIDString)"
}

"而且 PHP 是"
<?php
$uploaddir = '/fotos/';
$uploadfile = $uploaddir . basename($_FILES['file']['name']);
echo "<p>";
if (move_uploaded_file($_FILES['file']['tmp_name'], $uploadfile)) {
  echo "File is valid, and was successfully uploaded.\n";
} else {
  echo "Upload failed";
}
echo "</p>";
echo '<pre>';
echo 'Here is some more debugging info:';
print_r($_FILES);
print "</pre>";
?>

最后,我收到的错误是:
****** 响应数据 =
上传失败
这是更多的调试信息:Array
(
    [file] => Array
        (
            [name] => Optional(\"boda20160428_135709.jpg\")
            [type] => 
            [tmp_name] => 
            [error] => 1
            [size] => 0
        )

)

非常感谢任何提示。

1
RTFM?http://php.net/manual/zh/features.file-upload.errors.php 错误#1 = 文件大小超过了在php.ini中设置的限制。 - Marc B
2个回答

0

看起来Marc B已经评论了答案,即这是一个PHP文件上传大小问题。

然而,在这种情况下,值得分别测试链中的每个链接。例如,测试和审查createBodyWithParameters的输出。创建一个测试并在那里运行它以检查标题是否正确形成。特别要确保字符串编码是正确的。我不熟悉NSMutableData上的appendString方法。

应该可以更直接地将该输出馈送到服务器以消除其他潜在问题。


谢谢Joseph。一旦max_size问题被解决,我现在得到的错误是=> 0,但上传仍然失败。跟踪几乎没有提供任何信息:******响应数据= <p>上传失败</ p> <pre>这里有更多的调试信息:数组([file] => Array([name] => img.jpg [type] => image / jpg [tmp_name] => / tmp / phppWL1iR [error] => 0 [size] => 66605))</ pre> - Gosdi

0

正确的答案是图片太大了,您需要在上传之前压缩图片,使用以下方法

 UIImageJPEGRepresentation(image,0.2)

当图像足够小时,您将获得临时名称


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接