php curl请求中的request.files为空

时间:2019-06-17 11:16:46

标签: php curl

我正在尝试将此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 :(得分:0)

首先,不要尝试使用@方法上传文件,在PHP 5.5中已弃用该文件,在PHP 5.6中默认禁用,在现代PHP中的PHP 7.0.0中已将其完全删除,使用CURLFile上传文件。同样在第10行中,您没有对$ file_name进行urlencode,这是一个错误。在第17行中,您尝试将其编码为application/x-www-form-urlencoded格式(通过http_build_query),但是当您给CURLOPT_POSTFIELDS一个字符串时,您尝试转换的命令使用multipart/form-data格式( (由http_build_query返回),curl默认情况下将其发送为application/x-www-form-urlencoded,但要使curl以multipart/form-data格式发送(根据需要),请将CURLOPT_POSTFIELDS设置为数组,而不是字符串,然后curl将以multipart / form-data的形式发送。