Php загружает изображение на удаленный сервер с помощью cURL
Я хотел бы использовать cURL в php для загрузки изображения на удаленный сервер изображений. У меня есть этот фрагмент кода, он находится на веб-сервере:
<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)
Я хочу напрямую передать файл изображения сценарию удаленного сервера, поэтому таким образом я не нужно переписывать весь сценарий загрузки. Я попытался опубликовать имя изображения, тип, размер в качестве переменных post, но у меня нет ['tmp_name'], так как его нет на локальном хосте.
Как я могу решить эту проблему? Спасибо вам, ребята, за любую помощь!
1 answers
Вот возможное решение;
- Обработайте загрузку на вашем веб-сервере и переместите загруженный файл в локальное временное местоположение
- Затем сделайте запрос curl POST на удаленный сервер и сообщите ему имя и данные загруженного файла; в виде строки base64_encoded
- Скрипт удаленного сервера получает отправку в виде стандартного http-сообщения
- Все, что теперь нужно сделать, это расшифровать данные файла, сохранить их как указанное имя файла
Итак, вот как выглядит решение например:
Извините, я не проверял это, но это должно сработать.
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";
}