如何上传一个有空格的文件是用curl + php命名的?

时间:2011-04-14 11:48:03

标签: php curl

我正在使用此代码将文件上传到我的服务器,使用HTTP POST:

$ch = curl_init();
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_VERBOSE, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, true);
$post = array(
    "upload" => '@' . $filepath
);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
$curl_result = curl_exec($ch);

当$ filepath不包含空格时,此代码有效。但是,有可能。当我用空格测试路径时,我得到卷曲错误“创建formpost数据失败”。

curl手册并没有告诉我该怎么做,它给我的是unix文件名,没有空格。我试着按照http://curl.haxx.se/mail/archive-2006-01/0079.html这样做,但它也没有帮助我:

"upload" => '"@' . $filepath . '"'
"upload" => '@"' . $filepath . '"'

有人有想法吗?

5 个答案:

答案 0 :(得分:2)

当前版本的cURL(和PHP-cURL)处理文件名中的空格没有任何问题。旧版本可能有错误,我不确定。检查您是否使用了合理的最新版本。

我可以确认文件名中的空格在Linux 5.2.13和Linux上的libcurl / 7.19.4下完全没问题。

您获得的错误消息与PHP / cURL无法找到文件时的错误消息相同。问题是代码中的其他地方存在问题。可能是文件名中的空格不足或过度转义的问题,但可能不是cURL本身的问题。

我建议在你的代码中寻找问题的其他地方,或者生成一个问题的硬编码示例(其中$ filename直接在PHP中设置,而不是从其他地方读取)。

答案 1 :(得分:1)

您需要realpath

$filepath = 'D:\7 habits copy.txt';
$url = 'http://www.speedyshare.com/upload.php?'.rand(10000000, 99999999);
$ch = curl_init();
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_VERBOSE, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, true);
$post = array(
    "upload" => '@' . realpath($filepath)
);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
$curl_result = curl_exec($ch);
echo $curl_result;

甚至在Windows上工作。我很确定它可以在* NIX系统上运行

答案 2 :(得分:1)

我遇到了同样的问题,我无法在系统上升级CURL。

所以我编写了一个简单的 escape 函数,该函数迭代字符串以替换+符号的空格字符,这是用空格表示URL的传统方式。

令我惊讶的是,它奏效了。 :)

C ++ 代码:

#include <algorithm>
#include <string>

std::string s = "";
std::replace(s.begin(), s.end(), ' ', '+');    

答案 3 :(得分:-1)

你需要逃离空间。不确定你会使用的语法,但可能是这样的:

'This is the file name with spaces.txt'

'This\ is\ the\ file\ name\ with\ spaces.txt'

我再也不确定语法只是一个例子

或者您可能只需要在文件名中添加引号,如下所示:

'This is the file name with spaces.txt'

答案 4 :(得分:-1)

将目标文件放在变量中,例如&#39; read&#39;,并在curl命令中传递变量。确保变量是双引号,curl将处理它。

例如:

curl -T /PATH/TO/YOUR/FILE/DIRECTORY/"$f"