Как я могу загрузить файл с пробелами, его имя с curl + php? - PullRequest
5 голосов
/ 14 апреля 2011

Я использую этот код для загрузки файла на мой сервер, используя 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 не содержит пробелов.Тем не менее, возможно, что это возможно.Когда я тестирую путь с пробелами, я получаю сообщение об ошибке curl "не удалось создать пустые данные".

Руководство по curl не говорит мне, что делать, все, что мне дает, это имена файлов unix без пробелов.Я попытался выполнить http://curl.haxx.se/mail/archive-2006-01/0079.html примерно так, но мне это тоже не помогло:

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

У кого-нибудь есть идея?

Ответы [ 5 ]

2 голосов
/ 14 апреля 2011

Текущие версии cURL (и PHP-cURL) обрабатывают пробелы в именах файлов без проблем.В старых версиях могли быть ошибки, я не уверен.Убедитесь, что вы используете достаточно свежие версии.

Я могу подтвердить, что пробелы в именах файлов вообще не проблема в PHP 5.2.13 и libcurl / 7.19.4 в Linux.

Сообщение об ошибке выполучается то же самое, что когда PHP / cURL не может найти файл.Скорее всего, проблемы где-то еще в вашем коде.Вероятно, проблема недостаточного или чрезмерного выхода за пределы пробелов в имени файла, но, вероятно, не проблема самого cURL.

Я бы посоветовал поискать проблему в другом месте вашего кода или создать жестко закодированный примервозникшей проблемы (где $ filename устанавливается в PHP напрямую, а не читается откуда-либо еще).

1 голос
/ 05 апреля 2012

Я столкнулся с той же проблемой и не смог обновить CURL в системе.

Итак, я написал простую функцию escape , которая повторяла строку, чтобы заменить символ пробела для знака +, который является традиционным способом представления URL пробелами.

К моему удивлению, это сработало. :)

C ++ код:

#include <algorithm>
#include <string>

std::string s = "";
std::replace(s.begin(), s.end(), ' ', '+');    
1 голос
/ 14 апреля 2011

Вам нужен 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

0 голосов
/ 27 февраля 2015

Поместите целевой файл в переменную, такую ​​как 'while read', и передайте переменную в curl команде. Убедитесь, что переменная заключена в двойные кавычки, и curl ее обработает.

Например:

curl -T /PATH/TO/YOUR/FILE/DIRECTORY/"$f"
0 голосов
/ 14 апреля 2011

Вам нужно будет сбежать из пробелов.Не уверен в синтаксисе, который вы бы использовали, но, может быть, что-то вроде этого:

'This is the file name with spaces.txt'

до

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

снова Я не уверен в синтаксисе, это всего лишь пример

или вам может понадобиться просто добавить к имени файла кавычки, например:

'This is the file name with spaces.txt'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...