【问题标题】:Upload image to Database from Swift through Php通过 PHP 将图像从 Swift 上传到数据库
【发布时间】:2020-10-19 22:31:47
【问题描述】:

我正在尝试将图像上传到我的本地主机服务器并将路径保存到数据库。我已经有一些其他代码,我在其中上传了一个新对象。是否可以使用如下所示的相同功能上传图像。我还没有找到任何关于如何在同一函数中(在同一 sql 请求中)使用其他上传来执行此操作的好的教程。 Spot 对象有一个元素图像,即UIImage,必须上传。

Swift 代码:

if let url = URL(string: "http://localhost:8080/add.php") {
    var request = URLRequest(url: url)
    request.httpMethod = "POST"
    request.timeoutInterval = 20.0
    var dataString = "secretWord=235ghzjg35" // starting POST string with a secretWord
    
    dataString = dataString + "&name=\(spot.name!)"
    dataString = dataString + "&lat=\(spot.lat!)"
    dataString = dataString + "&long=\(spot.long!)"
    
    let dataD = dataString.data(using: .utf8)
    
    do{
        let uploadJob = URLSession.shared.uploadTask(with: request, from: dataD) { data, response, error in
            if error != nil {
                DispatchQueue.main.async {
                    print("No connection")
                }
            }
            else {
                if let unwrappedData = data {
                    let returnedData = NSString(data: unwrappedData, encoding: String.Encoding.utf8.rawValue)
                    if returnedData == "1"{
                        DispatchQueue.main.async {
                            print("Upload completed")
                        }
                    }
                    else {
                        DispatchQueue.main.async {
                            print(returnedData ?? "no data back'")
                        }
                    }
                }
            }
        }
        uploadJob.resume()
    }
}

PHP代码:

<?php
$secret = $_POST["secretWord"];
if ("235ghzjg35" != $secret) exit;

$name = $_POST["name"];
$lat = $_POST["lat"];
$long = $_POST["long"];

//$img0 = $_FILES['img0'];
//$target0 = "spotImages/" . $name;
//$target0 = $target0 . basename($img0);

// Create connection
$con=mysqli_connect("localhost", "user", "pass", "db");

// Check connection
if (mysqli_connect_errno()) {
    echo "Failed to connect to MySQL: " . mysqli_connect_error();
}

//then adding here the image
$sql = "INSERT INTO `table` (`id`, `name`,  `long`, `lat`) VALUES (NULL, '". $name ."', '". $long ."', '". $lat  ."');";

$result = mysqli_query($con, $sql);
echo $result;
mysqli_close($con);?>

此外,我想知道在如何使用 Swift 为我的应用程序管理数据库方面是否有更好的解决方案。我已经阅读了一些关于 Firebase 和 Realm.io 的内容。有没有人有任何经验?如果是这样,有什么优点和缺点?我应该考虑使用它而不是我的方法吗?

【问题讨论】:

  • 将图像作为String 发送到您的数据库。我以前做过。

标签: php sql swift


【解决方案1】:

几个观察:

  1. 您问题中的代码正在构建application/x-www-form-urlencoded 请求。要上传图像,您通常不会使用这种类型的请求。问题是您不能在其中包含二进制图像数据。理论上,您可以在构建请求时对图像数据进行 base64 编码,并在服务器上对其进行 base64 解码,但这会使请求增大 33%,并在客户端和服务器端增加不必要的工作。

  2. 另外,如果您使用application/x-www-form-urlencoded,您必须对发送到服务器的值进行百分比转义(例如,如果您的“名称”中有空格或其他保留字符,如果不是百分比,请求将是错误的-逃脱)。见HTTP Request in Swift with POST method

  3. 综上所述,在发送图像时,您通常会使用multipart/form-data,如Upload image with parameters in Swift 中所述,消除了上述问题。您可以在一个请求中发送图像和这些字段。

    虽然我试图展示如何在另一个答案中构建 multipart/form-data 请求,但您可能会考虑使用像 Alamofire 这样的库来帮助您摆脱构建这些复杂请求的麻烦。

  4. 在 PHP 中解析multipart/form-data 请求时,您将使用$_FILES,如Handling File Uploads 中所述。

  5. 您永远不应该只从请求中获取字段并从中构建 SQL 语句。在最坏的情况下,它会使您容易受到 SQL 注入攻击。充其量,如果用户发送一个包含 SQL 字符串分隔符的字符串,它只会失败。

    您应该使用mysqli_stmt::bind_param 将值绑定到SQL 中的? 占位符,或者,如果手动构建SQL,请确保在将它们插入SQL 语句之前使用mysqli::real_escape_string

  6. 你问:

    此外,我想知道在如何使用 Swift 为我的应用程序管理数据库方面是否有更好的解决方案。我已经阅读了一些关于 Firebase 和 Realm.io 的内容。有没有人有任何经验?如果是这样,有什么优点和缺点?我应该考虑使用它而不是我的方法吗?

    这个问题可能过于宽泛,无法在此处合理回答,但简而言之,当然,如果您想摆脱编写自己的服务器代码的世界,那么,是的,您应该考虑这些解决方案。这些使您摆脱了后端开发的麻烦。 Re Firebase vs Realm.io,这是一个见仁见智的问题,因此被认为是 Stack Overflow 的主题。但两者都是成熟的解决方案,随着您的应用扩展,它们会涉及一些成本。

    对于它的价值,如果您决定要编写自己的 PHP 代码,我可能会建议您考虑使用 PHP 框架,例如 Laravel。它为身份验证提供脚手架,从 SQL 语句中抽象出来等等。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-03
    • 1970-01-01
    • 1970-01-01
    • 2019-02-01
    • 1970-01-01
    • 2011-04-21
    • 2015-09-18
    • 2014-02-25
    相关资源
    最近更新 更多