отдача файла с помощью PHP

_Дмитрий_

Новичок
Есть ссылка, в которой href указывает на реальный файл на сервере, но запрещенный для прямой скачки
<a class="JS_send" href='path_server/file.txt'>ссылка</a>

ajax-ом отправляю href на сервер
$(".JS_send").on('click', function(e){
var url = $(this).attr('href');
e.preventDefault();
$.ajax({
url: '/url',
type: 'POST',
dataType: 'JSON',
data: 'url='+url});
})

на сервере ловлю эту ссылку на файл в переменную $file и пытаюсь отправить этот файл для скачивания
PHP:
if (file_exists($file)) {
// сбрасываем буфер вывода PHP, чтобы избежать переполнения памяти выделенной под скрипт
        if (ob_get_level()) {
            ob_end_clean();
        }
        // заставляем браузер показать окно сохранения файла
        header('Content-Description: File Transfer');
        header('Content-Type: application/octet-stream');
        header('Content-Disposition: attachment; filename=' . basename($file));
        header('Content-Transfer-Encoding: binary');
        header('Expires: 0');
        header('Cache-Control: must-revalidate');
        header('Pragma: public');
        header('Content-Length: ' . filesize($file));
        // читаем файл и отправляем его пользователю
        readfile($file);
        exit;
    }
однако ни чего не происходит.
 

WMix

герр M:)ller
Партнер клуба

_Дмитрий_

Новичок
"скачки" от слова скачивать
запрет делаю в .htaccess, но не в этом суть

ловлю эту ссылку, из POST.
файл читается и я его содержимое могу вернуть в ответе ajax, но мне надо что бы это содержимое вывело окошко на сохранение

просто мне надо отдавать файл на "скачку" не перегружая страницу
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Переделываем ссылку в что-то вида <a class="JS_send" href='downloadfile.php?id=xxx'>ссылка</a>

Далее все по накатанному через readfile и заголовки. Ясен пень, что как надо без перезагрузки. При чем тут ваще AJAX?
 

_Дмитрий_

Новичок
да с сылкой все нормально, файл читается, содержимое возвращается
AJAX при том чтоб без перезагрузки.

ладно счас набросаю примерчик, мож непонятно объясняю
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
У тебя и так нету перезагрузки страницы
 

_Дмитрий_

Новичок
мне надо из ссылки или неважно откуда например
<div rel="/public/backup/2013.08.01_19-14-14.zip">Скачать</div>

отправить это "/public/backup/2013.08.01_19-14-14.zip" на сервак
на серваке взять этот файл и выдать его в браузер но только чтоб было сообщение "сохранить или открыть", а не просто содержимое

счас получается вернуть только содержимое
 

_Дмитрий_

Новичок
пробовал и вот так
PHP:
function file_force_download_ngix($file) {
    if (file_exists($file)) {
        header('X-Accel-Redirect: ' . $file);
        header('Content-Type: application/octet-stream');
        header('Content-Disposition: attachment; filename=' . basename($file));
        exit;
    }
}
и вот так советовали
PHP:
function download($file) {
    $rFile = @fopen($file, 'r');
    $rOutput = fopen('php://output', 'w');
    if($rFile){
        header('Content-Disposition: attachment; filename='.basename($file));
        stream_copy_to_stream($rFile, $rOutput);
        exit();
    }
}
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
_Дмитрий_
Я уже написал тебе что надо сделать. У тебя ссылка на файл откуда берется? Из базы, файла, кеша или ты читаешь диск? Ну так вот, делаешь так, как я сказал выше. Можешь вместо id передать путь к файлу, и в файле уже считать его и отправить заголовки для скачивания.
 

_Дмитрий_

Новичок
да с файлом проблем нет, он читается, но отдается браузеру в виде содержимого
Заголовки ответа
HTTP/1.1 200 OK
Date: Fri, 02 Aug 2013 10:09:32 GMT
Server: Apache/2.2.22 (Win32) mod_ssl/2.2.22 OpenSSL/1.0.1c PHP/5.3.13
X-Powered-By: PHP/5.3.13
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Content-Disposition: attachment; filename=test.html
Content-Length: 1297
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html; charset=utf-8

ОТВЕТ
<!DOCTYPE html>
<html>
<head>
<title></title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
..........
и так далее содержимое файла

а мне надо чтоб запрос на сохранение выскочил
 

WMix

герр M:)ller
Партнер клуба
заголовки вроде правильные, мне кажется, что browser смущается когда ему говорят
Код:
Content-Type: text/html; charset=utf-8
и конечно показывает содержимое а не сгружает его
 

_Дмитрий_

Новичок
провел эксперемент
файл test.php
PHP:
<?php
$content = 'Содержимое файла';
$filename = 'my_super_file.txt';
header ("Content-Type: application/octet-stream");
header ("Accept-Ranges: bytes");
header ("Content-Length: " . strlen($content));
header ("Content-Disposition: attachment; filename=" . $filename);
если вызвать из строки браузера - выводится окошко сохранить/открыть содержимое
если вызывать аяксом, то содержимое тупо возвращается в ответе, и не предлагает окошко сохранить/открыть
 

_Дмитрий_

Новичок
загаловки:
из строки браузера
HTTP/1.1 200 OK
Date: Fri, 02 Aug 2013 10:16:24 GMT
Server: Apache/2.2.22 (Win32) mod_ssl/2.2.22 OpenSSL/1.0.1c PHP/5.3.13
X-Powered-By: PHP/5.3.13
Accept-Ranges: bytes
Content-Length: 31
Content-Disposition: attachment; filename=my_super_file.txt
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: application/octet-stream


аяксом
Apache/2.2.22 (Win32) mod_ssl/2.2.22 OpenSSL/1.0.1c PHP/5.3.13
PHP/5.3.13
Thu, 19 Nov 1981 08:52:00 GMT
no-store, no-cache, must-revalidate, post-check=0, pre-check=0
no-cache
Accept-Ranges bytes
Content-Length 31
Content-Disposition attachment; filename=my_super_file.txt
Keep-Alive timeout=5, max=100
Connection Keep-Alive
Content-Type application/octet-stream
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
_Дмитрий_
ЗАБУДЬ УЖЕ ПРО АЯКС, он не нужен тебе. Нужна ссылка на файл и обработчик скачки.
 

_Дмитрий_

Новичок
та блин мне нужно пнуть скрипт скачки без перезагрузки странички
потому как ссылки генерятся при первом заходе на страничку, потом мне надо кликая по ним давать возможность скачать по ним содержимое, не перегружаю эту страничку

если я по ссылке укажу например href="download.php?url=/fkjdfkfdjfdlk/test.html" тот перейду на эту download.php и потеряю сгенеренные ссылки

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

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Ок, будем спорить дальше. Я считаю, что ты никуда по ссылке не перейдешь. Потому что при клике на нее у тебя сразу будет выдаваться содержимое файла.

Вот пример http://rghost.ru/47843376
 

_Дмитрий_

Новичок
не, не будем спорить :)
сделал примерчик, работает...


tets.html
<a href="download.php?file=download.php">Скачать</a>

download.php
PHP:
<?php
$file = $_GET['file'];
    if (ob_get_level()) {
        ob_end_clean();
    }
    header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename=' . basename($file));
    header('Content-Transfer-Encoding: binary');
    header('Expires: 0');
    header('Cache-Control: must-revalidate');
    header('Pragma: public');
    header('Content-Length: ' . filesize($file));
    readfile($file);
exit;
 
Сверху