Быстрая загрузка изображения с параметрами с использованием данных multipart / form

Я пытаюсь загрузить изображение по пути конкретный моего сервера. Этот путь будет определяться параметрами, отправленными из запроса multipart/form-data.

Проблема: изображение не загружается по указанному пути, а загружается в корень моего сервера.

Я вызываю API, в котором есть функция php, чтобы сохранить это изображение по указанному пути. Я думаю, что функция PHP неправильно получает путь из параметров.

API, который я вызываю, выглядит примерно так

https://storage.myWebsiteName.com/upload_image.php/

Содержимое upload_image.php

   <?php
header('Access-Control-Allow-Origin: *'); 

//Unable to get path parameter and store in @target_dir, instead this function stores image in root
$target_dir = $_GET["path"];


$name = basename($_FILES["fileToUpload"]["name"]);
$target_file = $target_dir . $name;
$imageFileType = strtolower(pathinfo($target_file,PATHINFO_EXTENSION));
// Check if image file is a actual image or fake image

$actual_name = strtolower(
    pathinfo(
            $_FILES["fileToUpload"]["name"],PATHINFO_FILENAME));


    if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $target_file)) {
        echo $name;
    } else {
        echo "Sorry, there was an error uploading your file.";
    }

?>

Я получаю изображение из UIImagePickerController и передаю изображение этой функции, которая делает запрос multipart/form-data

func postImageToDB(image : UIImage) {

    let imagePostUrlStr =  "https://myWebsiteName.com/upload_image.php/"

    guard let imageData = UIImagePNGRepresentation(image) else {
      return
    }
    //want to save my image to this directory which is inside root
    let params = ["path" : "Brainplow/001243192018125835"]

    Alamofire.upload(multipartFormData: { (multiPartFormData: MultipartFormData) in
      //append path parameter
      for (key, value) in params {
        multiPartFormData.append(value.data(using: String.Encoding.utf8)!, withName: key)
      }
      multiPartFormData.append(imageData, withName: "fileToUpload", fileName: "testfilename.png", mimeType: "image/png")

    }, to: imagePostUrlStr) { (result: SessionManager.MultipartFormDataEncodingResult) in
      switch result {
      case .success(request: let uploadRequest, _, _ ):


        uploadRequest.uploadProgress(closure: { (progress) in

          print("Upload Progress: \(progress.fractionCompleted)")

        })

        uploadRequest.responseString { response in
          print("printing response string")
          print(response.value as Any)
          print(response)
          print(response.result)

        }

      case .failure(let error):
        print(error.localizedDescription)
      }
    }


  }

Примечание: внутри функции php, если я установил для каталога строку постоянный, она будет сохранена в этом пути. например, если я сделаю что-то ниже

$target_dir = "Brainplow"

Это работает нормально, но мне нужно определить этот каталог из параметров, отправленных из запроса multipart/form-data.

Мой каталог изображений выглядит следующим образом

Корневая директорияRoot Directory

Дочерний каталог

Child Directory

Великий Детский СправочникGrand Child Directory

Итак, я хочу иметь возможность передавать путь (пример: "Brainplow / 01113132018112642 /") в качестве параметра для запроса

Функция PHP должна получить путь из параметра и поместить туда изображение

Согласно моим исследованиям и борьбе, проблема связана с функцией PHP. Так что, возможно, вместо использования

$target_dir = $_GET["path"];

Мне, возможно, придется использовать

$target_dir = $_POST["path"];

Но я плохо разбираюсь в PHP. Но, может быть, есть еще одна проблема. Но мой быстрый код работает нормально. Просто мое изображение не соответствует тому пути, который я указываю.

Любая помощь приветствуется

Есть ли причина для отрицательного голосования по этому вопросу, пожалуйста?

Awais Fayyaz 11.04.2018 11:42
"Возможно, мне придется использовать $ target_dir = $ _POST [" path "];" - Пробовали?
Magnus Eriksson 11.04.2018 11:45

хотя не пробовал. Собираюсь попробовать сейчас

Awais Fayyaz 11.04.2018 11:46

Вы всегда должны делать все возможное, чтобы попытаться решить вашу проблему самостоятельно. перед разместив вопрос. Пожалуйста, прочтите Сколько исследовательских усилий ожидается от пользователей Stack Overflow?

Magnus Eriksson 11.04.2018 11:47

После всей борьбы. вот в чем проблема. Пришлось сменить $target_dir = $_GET["path"]; на $target_dir = $_POST["path"]

Awais Fayyaz 11.04.2018 12:04
1
5
1 003
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Изменена функция PHP

изменил эту строку

$target_dir = $_GET["path"];

К

$target_dir = $_POST["path"];

И это работает сейчас

вы также можете использовать $ _request ['path'] подробнее :: php.net/manual/en/reserved.variables.request.php

Ammar Tahir 11.04.2018 14:08

Полное решение для загрузки составного изображения с параметрами

#import Alamofire

func multipartImage(data:Data?, url:String,jsonInput:[String: String], completion: @escaping (_ result: DataResponse<Any>) -> Void) {

        Alamofire.upload(multipartFormData:
            { (multipartFormData) in

                if data != nil {
                    multipartFormData.append(data!, withName:"user_image", fileName:"image.jpg", mimeType:"image/jpeg")
                }else{
                    multipartFormData.append("".data(using: String.Encoding.utf8)!, withName: "user_image")
                }


                for (key, value) in jsonInput
                {
                    multipartFormData.append(value.data(using: String.Encoding.utf8)!, withName: key)
                }
        }, to:url, method: .post, headers: headers)
        { (result) in
            switch result {
            case .success(let upload, _ , _ ):
                upload.uploadProgress(closure:
                    { (progress) in
                        //Print progress
                })

                upload.responseJSON { response in

                    completion(response)

                }
            case .failure(let encodingError):
                print(encodingError.localizedDescription)
                break
            }
        }
    }

Этот ответ не актуален. т.к. вопрос был о том, как сохранить файл по пути, заданному параметром запроса. Как я уже упоминал в вопросе, если я использую жестко запрограммированный путь, мой быстрый код работает нормально.

Awais Fayyaz 05.12.2018 14:14

Другие вопросы по теме