Загрузка файла, но имя пусто - PullRequest
1 голос
/ 10 февраля 2020

У меня есть приложение IOS, которое использует PHP для моего API. Моя загрузка файла работает нормально, но имя файла не добавляется в файл. Я отразил другие страницы в своем приложении, но он все еще не работает, хотя другие работают нормально. Я могу видеть файл на сервере, но имя - notes-.jpg. Это не добавляет puuid к имени согласно коду. Я реализовал MessageKit на ViewController, который не работает (на всякий случай, если это имеет значение). Вот мой код ниже, я чувствую, что ищу иголку в стоге сена. Код немного неаккуратный (пожалуйста, не судите).

func createBodyWithParams(_ 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")
        }
    }


    // if file is not selected, it will not upload a file to server, because we did not declare a name file
    var filename = ""

    if imageSelected == true {
        filename = "notes-\(puuid).jpg"
        print("name of file", filename)
    }


    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

}

 func uploadImage(_ image: UIImage, completion: @escaping (URL?) -> Void) {
  print("im in upload")
  let avame = user!["ava"]
  let user_id = user!["id"] as! String
  let me = user!["username"] as! String
  let recipientfe = getmessages["recipient"]
  let uuidfe = getmessages["uuid"] as! String
  let recipient = getmessages["username"] as! String
  let rid = String(describing: getmessages["sender_id"]!)
let puuid = UUID().uuidString
    let text = ""

  let url = URL(string: "https://localhost/messagepost.php")!    
  var request = URLRequest(url: url)      
  request.httpMethod = "POST"
    let parameters = ["sender_id": user_id, "uuid": uuidfe, "sender": me, "recipient_id": rid, "recipient": recipient, "puuid": puuid, "text": text]

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

  var data = Data()

  if image != nil {
    data = image.jpegData(compressionQuality: 0.5)!
  }
  request.httpBody = createBodyWithParams(parameters, filePathKey: "file", imageDataKey: data, boundary: boundary)

  URLSession.shared.dataTask(with: request) { data, response, error in

      DispatchQueue.main.async(execute: {
          if error != nil {
              Helper().showAlert(title: "Server Error", message: error!.localizedDescription, in: self)
            print("Server Error")
              return
          }

          do {

              guard let data = data else {
                  Helper().showAlert(title: "Data Error", message: error!.localizedDescription, in: self)
                print("Data Error")
                  return
              }

            let json = try JSONSerialization.jsonObject(with: data, options: .allowFragments) as? NSDictionary

              guard let parsedJSON = json else {
                  return
              }
              if parsedJSON["status"] as! String == "200" {
                let newurl = parsedJSON["path"]
                self.isSendingPhoto = true
                  guard let url = newurl else {
                    return
                  }
                var message = Message(messageuser: self.sender, image: image)
                message.downloadURL = url as? URL

                    self.save(message)
                    self.messagesCollectionView.scrollToBottom()

              } else {

                  if parsedJSON["message"] != nil {
                      let message = parsedJSON["message"] as! String
                      Helper().showAlert(title: "Error", message: message, in: self)
                    print("where am i", parsedJSON["message"] as Any)
                  }

              }

          } catch {
              Helper().showAlert(title: "JSON Error", message: error.localizedDescription, in: self)
            print("where am i 2")
          }

      })
  }.resume()        

}

PHP Загрузить файл

<?php
if (!empty($_REQUEST["uuid"])) {
    $id = htmlentities($_REQUEST["id"]);
    $recipient = htmlentities($_REQUEST["recipient"]);
    $recipient_id = htmlentities($_REQUEST["recipient_id"]);
    $uuid = htmlentities($_REQUEST["uuid"]);
    $puuid = htmlentities($_REQUEST["puuid"]);
    $text = htmlentities($_REQUEST["text"]);
    $sender = htmlentities($_REQUEST["sender"]);
    $sender_id = htmlentities($_REQUEST["sender_id"]);

if (isset($_FILES['file']) && $_FILES['file']['size'] > 1) {

    $folder = "/home/xxxxx/public_html/notes/" . $uuid;

    // if no posts folder, create it
    if (!file_exists($folder)) {
        mkdir($folder, 0777, true);
    }

    $picture = $folder . "/" . basename($_FILES["file"]["name"]);
            chmod($picture,0777);

    if (move_uploaded_file($_FILES["file"]["tmp_name"], $picture)) {

        $path = "http://localhost/notes/" . $uuid . "/notes-" . $puuid . ".jpg"; 

        $returnArray["message"] = "Post has been made with picture";

        $returnArray["path"] = $path;
        $returnArray["status"] = "200";
    } else {
        $returnArray["message"] = "Post has been made without picture";
        $path = "";
    }
        $result=$access->insertMessage($recipient, $recipient_id, $uuid, $sender,$sender_id, $text, $path);
       // STEP 2.5 If posts are found, append them to $returnArray
       if (!empty($result)) {

        $returnArray["message"] = $result;
       $result = $access->updatebadge($recipient_id);
}
    else {
    $returnArray["message"] = "Couldnt insert". $puuid ."";

    }



 // if data is not passed - show posts except id of the user

}
else {

    $username = htmlentities($_REQUEST["username"]);
    $uuid = htmlentities($_REQUEST["uuid"]);
    $recipient_id = htmlentities($_REQUEST["recipient_id"]);

    $message = $access->conversation($username, $uuid, $recipient_id);

    if (!empty($message)) {
        $returnArray["message"] = $message;
    }

}

}
$access->disconnect();
echo json_encode($returnArray);



?>

1 Ответ

0 голосов
/ 11 февраля 2020

Я понял это. Тело и заголовки в Swift были неправильными и не отправляли правильное имя файла.

Я изменил тело на:

// web development and MIME Type of passing information to the web server
  let boundary = "Boundary-\(NSUUID().uuidString)"
  request.setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type")

  // access / convert image to Data for sending to the server
  var data = Data()

  // if picture has been selected, compress the picture before sending to the server
  if image != nil {
    data = image.jpegData(compressionQuality: 0.5)!
  }

  // building the full body along with the string, text, file parameters
  request.httpBody = Helper().body(with: parameters, filename: "notes-\(puuid).jpg", filePathKey: "file", imageDataKey: data, boundary: boundary) as Data
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...