我正在尝试将此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请求中做错了什么
答案 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的形式发送。