我正在使用此代码将文件上传到我的服务器,使用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 . '"'
有人有想法吗?
答案 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"