request.files пуст от запроса php curl - PullRequest
0 голосов
/ 17 июня 2019

Я пытаюсь преобразовать этот запрос curl в php.

curl -X POST -F "file=@test_img.jpg" "http://127.0.0.1:5000/FileUploading/UploadImage/"test_img.jpg"

Этот запрос корректно работает со следующим кодом flask-RESTful

class UploadImage(Resource):
def post(self, fname):
    file = request.files['file']
    if file:
        # From flask uploading tutorial
        filename = secure_filename(file.filename)
        file.save(os.path.join("Images/", filename))
        return jsonify({"Path": "Images/" + filename})
    else:
        # return error
        return {'False'}

Однако, следующий php curlзапрос возвращает ошибку 400, так как кажется, что параметр request.files пуст.

$file_name = "test_img.jpg";
$post_data = array(
     "file" =>  "@" . $file_name,
     "type" => 'image/jpg'
);
$ch = curl_init();

debug_to_console(http_build_query($post_data));
$host = "http://127.0.0.1:5000";
$url = $host . "/FileUploading/UploadImage/" . $file_name;
debug_to_console($url);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);

$file_param = 'file=' . $file_name;
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($post_data));

$headers = array();
$headers[] = "Content-Type: multipart/form-data";
debug_to_console($headers);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);


$result = curl_exec($ch);
if (curl_errno($ch)) {
    debug_to_console('Error:' . curl_error($ch));
}
curl_close($ch);

Я не знаю, что я делаю неправильно в этом запросе php

1 Ответ

0 голосов
/ 17 июня 2019

Во-первых, не пытайтесь загружать файлы, используя метод @, он устарел в PHP 5.5, отключен по умолчанию в PHP 5.6 и полностью удален в PHP 7.0.0, в современном PHP используйте CURLFile для загрузки файлов.также в строке 10 вы не urlencode $ file_name, это ошибка.и в строке 17 вы пытаетесь закодировать его в application/x-www-form-urlencoded -формат (через http_build_query), но команда, которую вы пытаетесь преобразовать, использует multipart/form-data -формат, когда вы даете CURLOPT_POSTFIELDS строку (как возвращено http_build_query)), curl отправит его как application/x-www-form-urlencoded по умолчанию, но чтобы curl отправлял его в multipart/form-data -формат (как вам нужно), установите CURLOPT_POSTFIELDS в массив, а не строку, и curl отправит его в multipart / form-данные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...