Подтвердить что ты не робот

Как загрузить файл в целевой каталог с помощью curl?

В моей локальной машине есть файл "/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? Как его исправить?

4b9b3361

Ответ 1

Это ошибка низкого уровня.

curl_setopt($ch, CURLOPT_URL, "ftp://$usr:[email protected]$host$ftp_path/$dest");

Ответ 2

Используйте copy():

copy('/home/test.mp4', '/var/www/ok.mp4');

Нет смысла запускать файл через сетевой стек (это то, что делает cURL), на любой протокол (HTTP, FTP,...), когда манипуляция может выполняться локально через файловую систему. Использование сети более сложно и подвержено ошибкам.

Ответ 3

попробуйте что-то вроде этого, и я чувствую, что вместо пути к каталогу сервера это будет 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);

Ответ 4

Этот код может помочь вам:

<?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*/

Ответ 5

Попробуйте указать тип MIME файла, отправленного таким образом

curl_setopt(
    $request,
    CURLOPT_POSTFIELDS,
    array(
       'file' => '@' . realpath('/home/test.mp4') . ';type=video/mp4'
    ));

Ответ 6

Код, который вы отправили, относится к стороне клиента. Если вы хотите загрузить файл с помощью 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');
    }
}

Ответ 7

curl -X POST -F "[email protected]" http://example.com/

Вам также понадобится страница, которая может обрабатывать этот запрос (POST)