Загрузите файл и загрузите его с помощью PHP и AJAX - PullRequest
1 голос
/ 20 ноября 2011

Я разрабатываю веб-приложение, которое использует JQuery AJAX и PHP для загрузки некоторых данных в мою базу данных.

Одним из полей формы для отправки является URL-адрес изображения (любой адрес веб-сайта).Это изображение должно быть загружено на мой FTP-сервер, а затем его новый адрес будет вставлен в базу данных.

Как я могу загрузить изображение с любого URL-адреса и загрузить его на мой FTP-сервер?

Форма:

<form id="form-id" method="post" action="insert.php" charset=utf-8">
    <input type="text" name="title" id="title">
    <input type="text" name="image-url" id="image-url">
    <input type="submit" name="submit" id="submit">
</form>

JavaScript

$("#submit").live("click", function(event){
    event.preventDefault();
    $.ajax({
        type : "POST",
        url : "insert.php",
        data : {
          'title': valueTitle,
          'image': valueImage
        },
        cache : false,
        success : function(html) {
        if (html == "success") {
            //...
        } else if (html == "ftp-error") {
            //...
        } else if (html == "sql-error") {
            //...
        }           
    }
    });     
});

insert.php

$title = $_REQUEST['title'];
$image = $_REQUEST['image'];

$imageInMyServer = downloadImageFromURLAndUploadFTP($image);
function downloadImageFromURLAndUploadFTP($image) {
    //that is what I want to know how to do.
}

//sql query with $title and $imageInMyServer

Примечания:

  • Файл, который я хочу загрузить, отсутствует на моем сервере.Это где-то еще в Интернете, и мне нужно загрузить его на мой FTP-сервер
  • Нет.Я не могу использовать первый внешний URL в моем запросе SQL

Ответы [ 2 ]

1 голос
/ 20 ноября 2011

Вот отличный пример на , как выполнять FTP-переводы в PHP . Что касается загрузки файла, вы можете использовать wget, если вы используете Linux (используя функцию exec()).

exec('wget -q ' . $url . ' -0 /path/to/newfile');

Похищение фрагмента кода из той ссылки, которую я вам дал, вот как может выглядеть ваша функция:

function downloadImageFromURLAndUploadFTP($image) {
    // in your case it would be some img extension like .jpg, .gif, or .png
    // you can check the extension of $image and use that if you want.
    $newFile = '/path/to/newfile.ext';
    exec('wget -q ' . $image . ' -0 ' . $newFile);

    if (file_exists($newFile)) {
        // set up connection and login
        $connect = ftp_connect($ftpServer); 
        $login   = ftp_login($connect, $ftpUser, $ftpPass); 

        // check connection
        if (!$connect || !$login) { 
            die('FTP connection has failed!'); 
        } else {
            echo "Connected to {$ftpServer}, for user {$ftpUser}";
        }

        // upload the file
        $fileNameOnFTPServer = 'whateverYouWantToNameIt.ext'; // arbitrary extension
        $upload = ftp_put($connect, $fileNameOnFTPServer, $newFile, FTP_BINARY); 

        // check upload status
        if (!$upload) { 
            echo "FTP upload has failed!";
        } else {
            echo "Uploaded {$image} to {$ftpServer} as {$fileNameOnFTPServer}";
        }

        ftp_close($connect);
    }
}

Примечание: Иногда file_exists() ведет себя не так, как мы планировали, когда путь начинается с /. Например, /path/to/file может существовать, но file_exists() будет думать, что этого не произойдет, если вы не удалите начало "/". Один из способов обойти это проверить это так:

file_exists(substr($newFile, 1))

Удачи!

0 голосов
/ 20 ноября 2011

Альтернативным решением, если у вас нет привилегий exec, является использование curl для захвата изображения, или вы можете использовать file_get_contents(), есть много способов, это просто личное предпочтение.Ваш скрипт может выглядеть так, я уверен, что вы можете улучшить его.

insert.php

<?php
if(isset($_POST['image']) && isset($_POST['title'])){
    if(substr($_POST['image'],0,4)=='http'){
        $image = curlgetimage($_POST['image']);
        $info = pathinfo($_POST['image']);
        if(isset($info['extension']) && ($info['extension']=='gif' || $info['extension']=='png' || $info['extension']=='jpg')){
            $path='./temp/'.md5($_POST['image']).'.'.$info['extension'];
            file_put_contents($path,$image);
            if(ftp_put_image($path)===true){
                //Do your database stuff, remember to escape..
                unlink($path);
                echo 'Success';
            }else{
                echo 'ftp-fail';
            }
        }else{
            echo'File type not allowed';
        }
    }else{
        echo'Must start with http://';
    }
}else{
    header('Location: http://www.example.com/');
}


function ftp_put_image($file){
    if(!file_exists($file)){return false;}
    $fp = fopen($file, 'r');
    $conn_id = ftp_connect('ftp.yourhost.com'); //change
    $login_result = ftp_login($conn_id,'username','password'); //change
    $return=(ftp_fput($conn_id, $file, $fp, FTP_BINARY))?true:false;
    ftp_close($conn_id);
    fclose($fp);
    return $return;
}

function curlgetimage($url) {
    $header[] = 'Accept: image/gif, image/x-bitmap, image/jpeg, image/pjpeg';
    $header[] = 'Connection: Keep-Alive';
    $header[] = 'Content-type: application/x-www-form-urlencoded;charset=UTF-8';
    $curl = curl_init($url);
    curl_setopt($curl, CURLOPT_URL, $url);
    curl_setopt($curl, CURLOPT_USERAGENT, 'YourSpiderBot/0.01 (Bla Bla Robot; http://www.example.com; spider@example.com)'); //change
    curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
    curl_setopt($curl, CURLOPT_HEADER, 0);
    curl_setopt($curl, CURLOPT_REFERER, $url);
    curl_setopt($curl, CURLOPT_ENCODING, 'gzip,deflate');
    curl_setopt($curl, CURLOPT_AUTOREFERER, true);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($curl, CURLOPT_TIMEOUT, 60);
    $return = curl_exec($curl);
    curl_close($curl);
    return $return;
}
?>
...