在Linux命令行中使用curl --data上传文件的cURL http post方法

3

我一直在尝试使用Linux命令行上传文件到服务器,使用的命令是:

curl -v --data 'file=@/var/www/fbapp/images/registration.png' http://myserver/xmltest/curlupload.php

但它没有将文件上传到服务器,尽管它已经发送了响应。

虽然如果我使用这个命令,它会上传文件并发送响应:

curl -v -F 'filename=registration.png' -F 'file=@/var/www/fbapp/images/registration.png' http://myserver/xmltest/curlupload.php

但是我想要的是以 curl --data 格式的命令。

这是服务器上我的 PHP 代码:

<?php
$uploadpath = "images/";
$filedata = $_FILES['file']['tmp_name'];
echo "filedata= ".$filedata;
if ($filedata != '')
copy($filedata,$uploadpath."1.png");
echo "success";
?>

我得到的是这个响应头:

> POST /xmltest/curlupload.php HTTP/1.1
> User-Agent: curl/7.22.0 (i686-pc-linux-gnu) libcurl/7.22.0 OpenSSL/1.0.1 zlib/1.2.3.4 libidn/1.23 librtmp/2.3
> Host: myserver
> Accept: */*
> Content-Length: 44
> Content-Type: application/x-www-form-urlencoded
> 
* upload completely sent off: 44out of 44 bytes
< HTTP/1.1 200 OK
< Date: Thu, 06 Nov 2014 07:01:56 GMT
< Server: Apache
< Vary: Accept-Encoding
< Transfer-Encoding: chunked
< Content-Type: text/html
< 
* Connection #0 to host myserver left intact
* Closing connection #0
filedata= success

我该如何使用curl --data上传文件?

1个回答

8
你通常不能随意选择 -F 或 -d (--data)。接收你的帖子的网络服务器期望其中一种格式。如果你尝试提交的表单使用类型“multipart/form-data”,那么你必须使用 -F 类型。否则,你应该使用 -d,这将导致使用类型“application/x-www-form-urlencoded”进行发布。

使用 -F 的 multipart/formposts 使用特殊的格式化方式对邮寄进行处理,Mime-headers 分离不同的部分,每个部分都有自己的一组标头。

-d 只是发送给服务器解释/解码的原始数据。

curl FAQ 中提到。

(但由于在这种情况下你编写 PHP 代码,所以只需决定要接受哪种 POST 方法,然后使你的 curl 命令行使用它即可。)


1
“你不能随意选择使用-F或-d(--data)” - 因为他可以修改他的PHP代码,所以他可以。 - Valentin H

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接