Ответ 1
Это ошибка низкого уровня.
curl_setopt($ch, CURLOPT_URL, "ftp://$usr:[email protected]$host$ftp_path/$dest");
В моей локальной машине есть файл "/home/test.mp4"
,
Я хочу загрузить его в /var/www/ok.mp4
(имя было изменено при его загрузке). Весь исходный файл и целевой файл находятся на локальной машине.
Как исправить мой частичный код, добавить что-то или что-то изменить?
<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_string);
curl_exec($ch);
?>
Подумайте о Ram Sharma, код был изменен следующим образом:
<?php
$request = curl_init('http://127.0.0.1/');
curl_setopt($request, CURLOPT_POST, true);
curl_setopt(
$request,
CURLOPT_POSTFIELDS,
array(
'file' => '@' . realpath('/home/test.mp4')
));
curl_setopt($request, CURLOPT_RETURNTRANSFER, true);
echo curl_exec($request);
// close the session
curl_close($request);
?>
Появится сообщение об ошибке:
Это работает!
Это веб-страница по умолчанию для этого сервера.
Программное обеспечение веб-сервера работает, но контент еще не добавлен.
У меня есть тест с ftp_put, код1 отлично работает.
code1:
<?php
set_time_limit(0);
$host = 'xxxx';
$usr = 'yyyy';
$pwd = 'zzzz';
$src = 'd:/upload.sql';
$ftp_path = '/public_html/';
$des = 'upload_ftp_put.sql';
$conn_id = ftp_connect($host, 21) or die ("Cannot connect to host");
ftp_login($conn_id, $usr, $pwd) or die("Cannot login");
$upload = ftp_put($conn_id, $ftp_path.$des, $src, FTP_ASCII);
print($upload);
?>
Файл d:/upload.sql
в моем локальном компьютере можно загрузить в my_ftp_ip/public_html/upload_ftp_put.sql
с кодом 1.
Теперь я переписываю его с помощью curl в code2.
code2:
<?php
set_time_limit(0);
$ch = curl_init();
$host = 'xxxx';
$usr = 'yyyy';
$pwd = 'zzzz';
$src = 'd:/upload.sql';
$ftp_path = '/public_html';
$dest = 'upload_curl.sql';
$fp = fopen($src, 'r');
curl_setopt($ch, CURLOPT_URL, 'ftp://user:[email protected]/'.$ftp_path .'/'. $dest);
curl_setopt($ch, CURLOPT_UPLOAD, 1);
curl_setopt($ch, CURLOPT_INFILE, $fp);
curl_setopt($ch, CURLOPT_INFILESIZE, filesize($src));
curl_exec ($ch);
$error_no = curl_errno($ch);
print($error_no);
curl_close ($ch);
?>
Выходной сигнал ошибки - 6. Почему вы не можете загрузить мой локальный файл в ftp с помощью curl? Как его исправить?
Это ошибка низкого уровня.
curl_setopt($ch, CURLOPT_URL, "ftp://$usr:[email protected]$host$ftp_path/$dest");
Используйте copy()
:
copy('/home/test.mp4', '/var/www/ok.mp4');
Нет смысла запускать файл через сетевой стек (это то, что делает cURL), на любой протокол (HTTP, FTP,...), когда манипуляция может выполняться локально через файловую систему. Использование сети более сложно и подвержено ошибкам.
попробуйте что-то вроде этого, и я чувствую, что вместо пути к каталогу сервера это будет http url.
// initialise the curl request
$request = curl_init('http://example.com/');
// send a file
curl_setopt($request, CURLOPT_POST, true);
curl_setopt(
$request,
CURLOPT_POSTFIELDS,
array(
'file' => '@' . realpath('test.txt')
));
// output the response
curl_setopt($request, CURLOPT_RETURNTRANSFER, true);
echo curl_exec($request);
// close the session
curl_close($request);
Этот код может помочь вам:
<?php
$rCURL = curl_init();
curl_setopt($rCURL, CURLOPT_URL, 'http://www.google.com/images/srpr/logo11w.png');
curl_setopt($rCURL, CURLOPT_HEADER, 0);
curl_setopt($rCURL, CURLOPT_RETURNTRANSFER, 1);
$aData = curl_exec($rCURL);
curl_close($rCURL);
file_put_contents('bla.jpeg', $aData);
// file_put_contents('my_folder/bla.jpeg', $aData); /*You can use this too*/
Попробуйте указать тип MIME файла, отправленного таким образом
curl_setopt(
$request,
CURLOPT_POSTFIELDS,
array(
'file' => '@' . realpath('/home/test.mp4') . ';type=video/mp4'
));
Код, который вы отправили, относится к стороне клиента. Если вы хотите загрузить файл с помощью HTTP, вы, HTTP-сервер, должны иметь возможность обрабатывать этот запрос на загрузку и сохранять файл там, где хотите. "Сообщение об ошибке", вероятно, является веб-страницей по умолчанию для серверов.
Пример кода на стороне сервера в PHP, для справки:
<?php
if ($_FILES) {
$filename = $_FILES['file']['name'];
$tmpname = $_FILES['file']['tmp_name'];
if (move_uploaded_file($tmpname,'/var/www/ok.mp4')) {
print_r('ok');
} else {
print_r('failure');
}
}
curl -X POST -F "[email protected]" http://example.com/
Вам также понадобится страница, которая может обрабатывать этот запрос (POST)