2016-03-03 2 views
2

Я хотел бы использовать cURL в php для загрузки изображения на удаленный сервер изображений. У меня есть этот кусок кода, это на веб-сервере:Php загрузка изображения на удаленный сервер с помощью cURL

<form enctype="multipart/form-data" encoding="multipart/form-data" method="post" action="webform.php"> 
<input name="somevar" type=hidden value='.$somevar.'> 
<input name="uploadfile" type="file" value="choose"> 
<input type="submit" value="Upload"> 
</form> 

и:

if (isset($_FILES['uploadfile'])) { 

$filename = $_FILES['uploadfile']['tmp_name']; 
$handle = fopen($filename, "r"); 
$data  = fread($handle, filesize($filename)); 
$POST_DATA = array(
    'somevar' => $somevar, 
    'uploadfile' => $data 
); 
$curl = curl_init(); 
curl_setopt($curl, CURLOPT_URL, 'http://1.1.1.1/receiver.php'); 
curl_setopt($curl, CURLOPT_TIMEOUT, 30); 
curl_setopt($curl, CURLOPT_POST, 1); 
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($curl, CURLOPT_POSTFIELDS, $POST_DATA); 
$response = curl_exec($curl); 
curl_close ($curl); 
echo $response; 

} 

На сервере изображений У меня есть изображение загрузить обработку PHP-файл, который работал очень хорошо на локальном хосте, но я хотел бы использовать его на удаленном сервере. Это, как я обработал файл загруженное изображение в receiver.php:

move_uploaded_file($_FILES['uploadfile']['tmp_name'], $file) 

Я хочу, чтобы непосредственно передать файл изображения скрипт на удаленном сервере, так что этот способ мне не нужно переписывать сценарий загрузки всей , Я попытался опубликовать имя изображения, тип, размер как пост-переменные, но у меня нет ['tmp_name'], поскольку он не находится на локальном хосте.

Как я могу это решить? Спасибо, ребята, за любую помощь!

ответ

3

Вот возможное решение;

  • Ручка загрузки на веб-сервере и переместить загруженный файл в локальный каталог темп
  • Затем сделайте запрос локон POST на удаленный сервер и сказать ему, что загруженные данные имя файла & является; а base64_encoded строка
  • сценарий Удаленный сервер получает загрузку в качестве стандартного HTTP Post
  • Все это теперь сделать, это расшифровать файл данных, сохраните его в указанное имя файла

Итак, вот как решение выглядит так:

Извините, я не тестировал это, но он должен работать.

index.php

<?php 

// Handle upload 
if(isset($_POST["submit"])) 
{ 
    // Move uploaded file to a temp location 
    $uploadDir = '/var/www/uploads/'; 
    $uploadFile = $uploadDir . basename($_FILES['userfile']['name']); 
    if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadFile)) 
    { 
     // Prepare remote upload data 
     $uploadRequest = array(
      'fileName' => basename($uploadFile), 
      'fileData' => base64_encode(file_get_contents($uploadFile)) 
     ); 

     // Execute remote upload 
     $curl = curl_init(); 
     curl_setopt($curl, CURLOPT_URL, 'http://1.1.1.1/receiver.php'); 
     curl_setopt($curl, CURLOPT_TIMEOUT, 30); 
     curl_setopt($curl, CURLOPT_POST, 1); 
     curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); 
     curl_setopt($curl, CURLOPT_POSTFIELDS, $uploadRequest); 
     $response = curl_exec($curl); 
     curl_close($curl); 
     echo $response; 

     // Now delete local temp file 
     unlink($uploadFile); 
    } 
    else 
    { 
     echo "Possible file upload attack!\n"; 
    } 
} 

?> 

<!-- The data encoding type, enctype, MUST be specified as below --> 
<form enctype="multipart/form-data" action="index.php" method="POST"> 
    <!-- MAX_FILE_SIZE must precede the file input field --> 
    <input type="hidden" name="MAX_FILE_SIZE" value="30000" /> 
    <!-- Name of input element determines name in $_FILES array --> 
    Send this file: <input name="userfile" type="file" /> 
    <input type="submit" value="Send File" /> 
</form> 

Затем на receiver.php, вы можете сделать следующее:

// Handle remote upload 
if (isset($_POST['fileName']) && $_POST['fileData']) 
{ 
    // Save uploaded file 
    $uploadDir = '/path/to/save/'; 
    file_put_contents(
     $uploadDir. $_POST['fileName'], 
     base64_decode($_POST['fileData']) 
    ); 

    // Done 
    echo "Success"; 
} 
+0

Я попробую его в ближайшее время и ответьте, как она идет , Спасибо. – nobodyknowshim

+0

Спасибо, это работает! Я хотел бы указать будущим посетителям, что этот метод нуждается в большей безопасности, если вы хотите реализовать его в своем коде. Вам необходимо: проверить расширение, тип mime, размер, сгенерировать случайное имя, move_uploaded_file, использовать функцию imagecreatefromjpg и imagejpeg php. На сервере изображений вам необходимо: выполнить все вышеперечисленные задачи, чтобы убедиться, что никто не может избежать проверки безопасности, если кто-то прямо отправляет запрос на ваш сервер изображений. – nobodyknowshim

Смежные вопросы