簡體   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