можно ли загружать файл через PHP и перенаправлять? [Дубликат]

Если вы используете Node.js (например, если не вырезать и вырезать из нашего модуля), попробуйте этот пакет: https://www.npmjs.org/package/dataobject-parser

Построен модуль, который выполняет операции прямого / обратного действия:

https://github.com/Gigzolo/dataobject-parser

Он создан как объект, управляемый самостоятельно. Используется для экземпляра экземпляра DataObjectParser.

var structured = DataObjectParser.transpose({
    'ab.cd.e' : 'foo',
    'ab.cd.f' : 'bar',
    'ab.g' : 'foo2'
});                                                                                                                                                                                                                                                                                                                                                                                                                                                   

structured.data() возвращает ваш вложенный объект:

{ab: {cd: {e:'foo', f:'bar'}, g:'foo2'}}

Итак, вот рабочий пример в JSFiddle:

http://jsfiddle.net/H8Cqx/

57
задан Evan 5 May 2009 в 01:00
поделиться

10 ответов

Я не думаю, что это можно сделать, хотя я не уверен на 100%.

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

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

Ваш загрузка должна начинаться автоматически. Если не нажать [a href="create_csv.php"]here[/a].

Как о начале загрузки (например, при автоматическом вызове create_csv.php) у вас есть много вариантов:

  • HTML: [meta http-equiv="refresh" content="5;url=http://site/create_csv.php"]
  • Javascript: location.href = 'http://site/create_csv.php';
  • iframe: [iframe src="create_csv.php"][/iframe]
79
ответ дан tilz0R 27 August 2018 в 02:32
поделиться
  • 1
    избили меня ... :) – nickf 5 May 2009 в 01:11
  • 2
    1up для трех вариантов – saleem ahmed 10 January 2016 в 05:04
  • 3
    Как это сделать, поскольку инициация уже началась, и drupal уже показывает страницу? Что такое код javascript? – Justme 3 August 2016 в 16:55

Заголовок, который вы отправляете, - это HTTP-заголовки. Браузер принимает это как запрос страницы и обрабатывает его как страницу. И в вашем случае нужно загрузить страницу.

Таким образом, добавление заголовка переадресации к этому приводит к запутыванию всего процесса загрузки файла (поскольку заголовки собраны, сгенерированы в один заголовок и затем отправлены в браузер , вы можете попробовать это, установив несколько заголовков переадресации IIRC)

7
ответ дан Ólafur Waage 27 August 2018 в 02:32
поделиться

Запустите файл PHP, который содержит загрузку CSV, используя:

<a onclick="popoutWin(\'csvexport.php\')" >Download CSV File</a>

или

<input name="newThread" type="button" value="Download CSV File"
        onclick="popoutWin(\'csvexport.php\')" />

, где функция JavaScript popoutWin -

/*
 * Popout window that self closes for use with downloads
 */
function popoutWin(link){
    var popwin = window.open(link);
    window.setTimeout(function(){
        popwin.close();
    }, 500);
}

Это откроет окно, чтобы отобразить приглашение загрузки CSV, а затем сразу же закрыть окно, оставив только приглашение.

0
ответ дан brasofilo 27 August 2018 в 02:32
поделиться
  • 1
    Обратите внимание, что вам может потребоваться увеличить время popoutWin () до большего значения, например 5000, если для PHP-кода (csvexport.php выше) требуется время для запуска, иначе окно закроется до завершения скрипта, и пользователю не будет предоставлено возможность выбрать каталог для сохранения файла экспорта. – Clinton 2 August 2017 в 10:38
  • 2
    Это невероятно неразумно использовать случайную временную переменную. – jvakuiler 9 April 2018 в 09:14
  • 3
    Спасибо за отзыв @jvakuiler - я был бы рад понять, почему нет. Пожалуйста, укажите мне в правильном направлении и, если нужно, я удалю этот предлагаемый подход, как только я пойму ваш совет. – Clinton 9 April 2018 в 12:43
  • 4
    Привет @Clinton благодарит за ваше сообщение, я рад разработать. Прежде всего, вы не можете предположить, что открываемое окно будет загружаться в 500 мс, как вы предполагали. Вообще говоря, вы не можете предположить, что окно будет успешно открыто вообще в любое время. Загрузка также может привести к отказу от пользователя без информации, кроме сломанного якоря. – jvakuiler 9 April 2018 в 15:13

Я нашел одно обходное решение для этого, которое зависит от javascript, поэтому он не совсем безопасен, но для незащищенных критических сайтов он работает.

У вас есть форма с кнопкой под названием «скачать» с набором действий, указывающим на сценарий загрузки, а затем с помощью javascript поместите что-то в обработчик onsubmit, который удаляет кнопку загрузки и заменяет обмен сообщениями на экране , Загрузка должна произойти, и экран изменится. Очевидно, что если есть проблема с сценарием загрузки, все равно выглядит, что загрузка прошла успешно, даже если она не срабатывает, но это лучшее, что у меня есть сейчас.

1
ответ дан Darren Crabb 27 August 2018 в 02:32
поделиться

Вот ответ: Это работа! Вам нужны три разные части кода: HTML

<a id="download_btn" class="btn btn-primary" href="?file=filename&download=1">Download<&/a>

JQuery

$('#download_btn').click(function(){
    window.location.href = '<?=base_url()?>/?file=<?=$file;?>&download=1';
}).focusout (function(){
    window.location.href = '<?=base_url()?>';
    return false;
});

PHP

        if(isset($_GET['download']) && isset($_GET['file'])){

            $zip_path = 'path_to/'.$_GET['file'].'.zip';

            if(file_exists($zip_path)){
                header('Content-Type: application/zip');
                header('Content-Disposition: attachment; filename="'.basename($zip_path).'"');
                header('Content-Length: ' . filesize($zip_path));
                header('Location: '.$zip_path);
            }

        }
0
ответ дан Hisham Dalal 27 August 2018 в 02:32
поделиться

Имейте в виду, однако, автоматическое инициирование загружаемых файлов для пользователей IE вызовет вкладку предупреждений безопасности. Все три метода, описанные daremon, покажут это предупреждение. Вы просто не можете обойти это. Вам будет лучше, если вы предоставите реальные ссылки.

2
ответ дан martar 27 August 2018 в 02:32
поделиться
<?php 
    function force_file_download($filepath, $filename = ''){
        if($filename == ''){
            $filename = basename($filepath);
        }

        header('Content-Type: application/octet-stream');
        header("Content-Transfer-Encoding: Binary"); 
        header("Content-disposition: attachment; filename=\"" . $filename . "\""); 
        readfile($filepath); // do the double-download-dance (dirty but worky)  
    }

    force_file_download('download.txt');
?>
<script type="text/javascript">
    location = 'page2.php'
</script>

Вот решение, использующее javascript.

0
ответ дан nikksan 27 August 2018 в 02:32
поделиться

очень легко сделать в случае, если это действительно необходимо.

Но вам нужно немного поработать в JavaScript и кукисах:

в PHP вы должны добавить настройку cookie

header('Set-Cookie: fileLoading=true'); 

, а затем на странице, где вы вызываете загрузку, вы должны отслеживать с помощью JS (например, один раз в секунду), если есть подходящий файл cookie (используется плагин jQuery cookie здесь:

setInterval(function(){
  if ($.cookie("fileLoading")) {
    // clean the cookie for future downoads
    $.removeCookie("fileLoading");

    //redirect
    location.href = "/newpage";
  }
},1000);

Теперь, если файл начинает загружаться, JS распознает его и перенаправляет на страницу, необходимую после удаления файла cookie.

Конечно, вы можете скажите, что вам нужен браузер, чтобы принимать файлы cookie, JavaScript и т. д., но он работает.

8
ответ дан smnbbrv 27 August 2018 в 02:32
поделиться

Вы можете попробовать перенаправить URL-адрес и параметр, представляющий содержимое файла. И в перенаправлении вы можете выводить содержимое файла для загрузки.

0
ответ дан user 27 August 2018 в 02:32
поделиться

Это довольно старая проблема, но вот как я ее достиг через JS.

// Capture the "click" event of the link.
var link = document.getElementById("the-link");
link.addEventListener("click", function(evt) {
  // Stop the link from doing what it would normally do.
  evt.preventDefault();
  // Open the file download in a new window. (It should just
  // show a normal file dialog)
  window.open(this.href, "_blank");
  // Then redirect the page you are on to whatever page you
  // want shown once the download has been triggered.
  window.location = "/thank_you.html";
}, true);

Через - https://www.daniweb.com/web-development/php/ темы / 463652 / страница-не-перенаправление-после отправки-заголовков-в-PHP

0
ответ дан Vaibhav Jain 27 August 2018 в 02:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: