繁体   English   中英

从 Swift 到 Php 将图像上传到数据库

[英]Upload image to Database from Swift through Php

我正在尝试将图像上传到我的本地主机服务器并将路径保存到数据库。 我已经有一些其他代码,我在其中上传了一个新的 Object。 是否可以将图像上传到同一个 function 中,如下所示。 我没有找到任何关于如何在同一个 function (在同一个 sql 请求中)中的其他上传的好的教程。 Spot object 有一个元素图像,即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 的内容。 有没有人有任何经验? 如果是这样,有什么优点和缺点? 我应该考虑使用它而不是我的方法吗?

几点观察:

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

  2. 此外,如果您使用application/x-www-form-urlencoded ,则必须对发送到服务器的值进行百分比转义(例如,如果您的“名称”中有空格或其他保留字符,则请求格式错误如果不是百分比转义)。 请参阅Swift 中的 HTTP 请求,使用 POST 方法

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

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

  4. 在 PHP 中解析multipart/form-data请求时,您将使用处理文件上传中所述的$_FILES

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

    您应该将值绑定到? placeholders in your SQL using mysqli_stmt::bind_param or, if building the SQL manually, make sure to use mysqli::real_escape_string before inserting them into your SQL statement.

  6. 您问:

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM