Загрузка файла Ajax с использованием Jquery, PHP - PullRequest
20 голосов
/ 30 августа 2010

Я хочу использовать функцию ajax для загрузки, при которой пользователь щелкает ссылку для загрузки, которая (используя ajax и $ _GET) открывает файл PHP, который обработает отправленные переменные $ _GET и получит доступ к нужному файлу для загрузки.

У меня есть несколько PHP-скриптов для обработки переменных $ _GET, которые работают сами по себе, но при доступе через Ajax они перестают работать.

Ниже приведен код Ajax / PHP, который я использую:

function ajaxDown(){
$('#downloadmsg').html(
    '<img src=\"media/images/ajaxloader.gif\" width=\"128\" height=\"15\">');
$('#downloadmsg').load(
'media/downloads/downManager.php?file=".$filequery['filename']."&ftype=".$downex[1]."');
}

Пожалуйста, просмотрите мой код и помогите мне найти, что я делаю неправильно.

Спасибо

Ответы [ 2 ]

57 голосов
/ 30 августа 2010

Я думаю, проблема в том, что вы пытаетесь загрузить файл с результатом INTO #downloadmsg, который не будет работать, потому что .load () будет загружать результаты только как HTML ... НЕ двоичные данные или другие кодирование.

Один из подходов, который может сработать, - это создание скрытого iframe в HTML, например:

<iframe id="secretIFrame" src="" style="display:none; visibility:hidden;"></iframe>

Затем установите в качестве атрибута iframe строку запроса:

$("#secretIFrame").attr("src","myphpscript.php?option1=apple&option2=orange");

и затем использование заголовков PHP для принудительной загрузки при заданном источнике (вот пример набора заголовков экспортера из одного из моих сценариев, который использует поток октетов):

header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); 
header("Content-Type: application/force-download");
header("Content-Type: application/octet-stream");
header("Content-Type: application/download");
header("Content-Disposition: attachment;filename=data.xls ");
header("Content-Transfer-Encoding: binary ");

Надеюсь, это поможет!

6 голосов
/ 31 августа 2015

Я знаю, что опоздал!Но я думаю, что у меня есть решение, которое немного чище без использования скрытого iframe, и вам даже не понадобится ajax-запрос для этого!Использование заголовков PHP, как отмечено в принятом ответе в файле download.php

<?php
        //download.php 
        /*
          All your verification code will go here
        */      
        header("Pragma: public");
        header("Expires: 0");
        header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); 
        header("Content-Type: application/force-download");
        header("Content-Type: application/octet-stream");
        header("Content-Type: application/download");
        header("Content-Disposition: attachment;filename=".$_GET['file']);
        header("Content-Transfer-Encoding: binary ");

А на стороне JS просто

function download(filename){
    window.location="http://whateveryoursiteis.com/download.php?file="+filename;
}

Работает как шарм: O

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...