Скачать файл с php и полимером

У меня проблемы с этим. Я нашел несколько полезных скриптов в Интернете и модифицировал их для своих нужд. Однако я не могу загрузить файл. Он ответит содержимым файла, но не загрузит его. Я использую Polymer 1.0+ для своей клиентской части и PHP для своей серверной части. Код на стороне клиента для загрузки файла выглядит следующим образом:

   <!--THIS IS THE HTML SIDE-->
   <iron-ajax   
        id="ajaxDownloadItem"
        url="../../../dropFilesBackend/index.php/main/DownloadItem"
        method="GET"
        handle-as="document"
        last-response="{{downloadResponse}}"
        on-response="ajaxDownloadItemResponse">
    </iron-ajax>

//THIS IS THE JAVASCRIPT THAT WILL CALL THE "iron-ajax" ELEMENT
downloadItem:function(e){ 
    this.$.ajaxDownloadItem.params = {"FILENAME":this.selectedItem.FILENAME,
                                      "PATH":this.folder};
    this.$.ajaxDownloadItem.generateRequest();
},

Код на стороне сервера выглядит следующим образом (URL-адрес отличается, потому что я делаю некоторые изменения URL-адреса, чтобы получить правильный скрипт):

function actionDownloadItem(){
    valRequestMethodGet();
    $username = $_SESSION['USERNAME'];
    if(validateLoggedIn($username)){
        $itemName = arrayGet($_GET,"FILENAME");
        $path = arrayGet($_GET,"PATH");
        $username = $_SESSION['USERNAME'];

        $downloadItem = CoreFilePath();
        $downloadItem .= "/".$_SESSION['USERNAME']."".$path."".$itemName;

        DownloadFile($downloadItem);
    }
    else {
        echo "Not Logged In.";
    }
}

function DownloadFile($filePath) {
    //ignore_user_abort(true);
    set_time_limit(0); // disable the time limit for this script
    //touch($filePath);
    //chmod($filePath, 0775);

    if ($fd = fopen($filePath, "r")) {
        $fsize = filesize($filePath);//this returns 12
        $path_parts = pathinfo($filePath);//basename = textfile.txt
        $ext = strtolower($path_parts["extension"]);//this returns txt
        $header = headerMimeType($ext); //this returns text/plain
        header('Content-disposition: attachment; filename="'.$path_parts["basename"].'"'); // use 'attachment' to force a file download
        header("Content-type: $header");
        header("Content-length: $fsize");
        header("Cache-control: private"); //use this to open files directly
        while(!feof($fd)) {
            $buffer = fread($fd, 2048);
            echo $buffer;
        }
    }
    fclose ($fd);
}

Любая помощь в этом будет принята с благодарностью.


person wesleywh    schedule 23.12.2015    source источник
comment
Вам нужно будет написать прочитанное.   -  person frz3993    schedule 23.12.2015


Ответы (1)


Сначала вам понадобится дескриптор файла

$pathToSave = '/home/something/something.txt';

$writeHandle = fopen($pathToSave, 'wb');

Затем, пока вы читаете загрузку, записывайте в файл вместо эхо

fwrite($writeHandle, fread($fd, 2048));

Наконец, после завершения записи в файл закройте дескриптор

fclose($writeHandle);

Я пренебрегаю проверкой ошибок, вы должны реализовать свою собственную.

person frz3993    schedule 23.12.2015
comment
Это работает очень хорошо. Я проверил это будет несколько типов. Тем не менее, я хотел бы, чтобы какая-то загрузка происходила в браузере, чтобы я мог видеть, что это происходит, а не за кулисами без визуального обновления. - person wesleywh; 24.12.2015
comment
Я смог загрузить его через браузер, открыв URL-адрес моего php-кода без использования iron-ajax. ПРИМЕР: window.location.href = путь/к/php/функция; - person wesleywh; 22.01.2016