2015-07-04 10 views
25

Jest plik "/home/test.mp4" w moim komputerze lokalnym,Jak przesłać plik do katalogu docelowego za pomocą curl?

Chcę przesłać go do /var/www/ok.mp4 (nazwa zmieniła się, kiedy wysłał go). Cały plik źródłowy i docelowy znajdują się na komputerze lokalnym.

Jak naprawić mój częściowy kod, aby coś dodać lub coś zmienić?

<?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); 

?> 

Pomyśl Ram Sharma, kod został zmieniony, jak następuje:

<?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); 
?> 

komunikat o błędzie wystąpić:

To działa!
To jest domyślna strona internetowa tego serwera.
Oprogramowanie serwera WWW działa, ale nie dodano jeszcze żadnych treści.

Mam test z ftp_put, kod1 działa dobrze.

kod1:

<?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); 
?> 

pliku d:/upload.sql w moim lokalnym komputerze można przesyłać do my_ftp_ip/public_html/upload_ftp_put.sql z Kod1.
Teraz zmieniam go z curl na 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); 
?> 

informacji Wyjście błędu jest 6 .Why nie mogą przesyłać moje lokalnego pliku na ftp z curl Jak to naprawić?

+1

Jeśli jest już w lokalnym systemie plików, dlaczego nie po prostu ['copy ($ src, $ dest)'] (http://php.net/copy)? – mario

+0

Dlaczego mimo to '/ home /' byłby dostępny dla HTTP? A co miały robić "_POSTFIELDS"? – mario

+0

Teraz nie mam vps do przetestowania kodu, założenie, że wszystkie pliki źródłowe i docelowe w lokalnej maszynie mogą zostać zmienione, gdy podasz mi właściwy kod. –

Odpowiedz

3

To jest błąd niskiego poziomu .

1

wypróbuj coś takiego, a zamiast ścieżki katalogu serwera poczuję, że jest to adres URL http.

// 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); 
8

Zastosowanie copy():

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

To nie ma sensu, aby uruchomić plik przez stos sieciowy (co właśnie robi cURL), na jakimkolwiek protokołem (HTTP, FTP, ...), gdy manipulację można wykonać lokalnie, poprzez system plików. Korzystanie z sieci jest bardziej skomplikowane i podatne na błędy.

0

Spróbuj określić typ MIME pliku wysłanego jak ten

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

Ten kod może pomóc:

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

Chcę umieścić coś w url z lokalnego katalogu, a nie pobrać adres URL do mojego katalogu! –

0

Kod zostanie zaksięgowana jest po stronie klienta. Jeśli chcesz przesłać plik za pomocą protokołu HTTP, serwer HTTP musi być w stanie obsłużyć to żądanie przesyłania i zapisać plik tam, gdzie chcesz. "Komunikat o błędzie" to prawdopodobnie domyślna strona internetowa serwera.

Przykładowy kod po stronie serwera w PHP, dla odniesienia:

<?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'); 
    } 
} 
-3
curl -X POST -F "[email protected]" http://example.com/ 

Potrzebny będzie również strony, które można przetworzyć to żądanie (POST)