С нами с 21.06.05
Сообщения: 1788
Рейтинг: 1579
|
Добавлено: 14/11/06 в 22:53 |
Есть папка, скажем files, в которой хранятся файлы, скажем 1.rar и 2.rar.
Как отдать браузеру файл 1.rar на скачивание при заходе на download.php?id=1 ?
Если размер небольшой, то можно прочитать в память и отдать с нужными заголовками, а если там пиццот метров?
|
|
|
|
С нами с 16.10.05
Сообщения: 738
Рейтинг: 261
|
Добавлено: 14/11/06 в 23:08 |
Антилич скрипты попробуй поищи. Делают они именно то что тебе нужно + защита от хотлинка.
|
|
|
|
С нами с 30.06.06
Сообщения: 79
Рейтинг: 78
|
Добавлено: 14/11/06 в 23:15 |
Принцип действия такой:
Файл download.php
Ссылка на него такая: download.php?id=1 для файла rar2.rar
<?php
$links = array('rar1.rar', 'rar2.rar');
header ('location: '.$links[$_GET['id']])
?>
|
|
|
|
www.phpdevs.com
С нами с 24.10.02
Сообщения: 16633
Рейтинг: 16105
|
Добавлено: 14/11/06 в 23:21 |
читать по порциям, выдавать частями. А еще не забыть докачку
За $10 загляну в свои архивы и науйду этот файлик, которым архивы в сотни мег раздавал
|
|
Пишу на php/mysql/django за вменяемые деньги.
Обращаться в личку.
|
2
|
|
|
С нами с 03.10.06
Сообщения: 64
Рейтинг: 37
|
Добавлено: 15/11/06 в 01:16 |
А fpassthru вообще не подходит?
Стреляет быстро, серевер не особо грузит (проверял stress tool)
|
|
|
|
php наше всё :)
С нами с 26.07.04
Сообщения: 814
Рейтинг: 447
|
Добавлено: 15/11/06 в 08:52 |
I-Tog - Через Location ты засветишь урл файла.
Солидарен с Nicko.Ricci, юзал passthru для этого... Правда были траблы с именем файла отдаваемого...
|
|
|
|
С нами с 26.02.03
Сообщения: 2366
Рейтинг: 987
|
Добавлено: 15/11/06 в 22:10 |
Я помню недавно уже поднималась эта тема и там предлагали генеририровать symlink на файл, и через определенное время его менять создавая новый.
|
|
|
|
Genuine Quality
С нами с 28.08.05
Сообщения: 652
Рейтинг: 910
|
Добавлено: 16/11/06 в 00:32 |
я когда-то что-то подобное писал. код на яве, мож поможет
Код: |
// checking for range header
String range = request.getHeader("Range");
int range_start = -1;
if (range != null) {
range_start = Integer.parseInt(range.substring(range.indexOf('=') + 1, range.indexOf('-')));
}
// downloading
InputStream is = getServletContext().getResourceAsStream("/WEB-INF/" + zip.trim());
String fileName = zip.substring(zip.lastIndexOf('/') + 1);
response.setHeader("Content-Disposition", "attachment; filename=" + fileName);
response.setContentType("application/zip");
if (range_start != -1) {
response.setStatus(HttpServletResponse.SC_PARTIAL_CONTENT);
response.setContentLength(is.available() - range_start);
response.setHeader("Accept-Ranges", "bytes");
response.setHeader("Content-Range", "bytes " + range_start + "-" + (is.available() - 1) + "/" + is.available());
is.skip(range_start);
} else {
response.setStatus(HttpServletResponse.SC_OK);
response.setContentLength(is.available());
}
OutputStream os = response.getOutputStream();
byte[] buf = new byte[4 * 1024];
int bytesRead;
try {
while ((bytesRead = is.read(buf)) != -1) {
os.write(buf, 0, bytesRead);
Thread.sleep(15);
os.flush();
}
if (is.available() == 0) {
st.executeUpdate("UPDATE " + TABLE + " SET d_count = d_count+1 WHERE OID = \"" + oid + "\" AND SID = \"" + sid + "\"");
throw new Exception();
}
} catch (Exception e) {
synchronized (this.downloads) {
this.downloads.remove(info);
}
}
os.close();
is.close();
|
код работает прекрасно, файл прячется и снаружи никак не доступен, стоит ограничение на одновременное кол-во и скорость отдачи файлов
|
|
|
|
С нами с 26.02.06
Сообщения: 55
Рейтинг: 37
|
Добавлено: 16/11/06 в 04:30 |
по-моему самый простой (но не гибкий) способ в хтаксесе прописать:
RewriteEngine on
RewriteRule download.php?id=([0-9]+) $1\.rar [L]
|
|
|
|
С нами с 19.02.03
Сообщения: 1284
Рейтинг: 354
|
Добавлено: 16/11/06 в 10:50 |
используй symlink
для каждой сессии скачки создаешь symlink имя желательно через md5, потом его убиваешь через определенное время. Юзеру даешь ссылку на symlink
|
|
|
|
С нами с 25.08.05
Сообщения: 313
Рейтинг: 231
|
Добавлено: 16/11/06 в 14:27 |
http://www.php.net/manual/ru/function.passthru.php
Цитата: | If you are using passthru() to download files (for dynamically generated content or something outside webserver root) using similar code:
header("Content-Type: application/octet-stream");
header("Content-Disposition: attachment; filename=\"myfile.zip\"");
header("Content-Length: 11111");
passthru("cat myfile.zip",$err);
and your download goes fine, but subsequent downloads / link clicks are screwed up, with headers and binary data being all over the website, try putting
exit();
after the passthrough. This will exit the script after the download is done and will not interfere with any future actions. |
имхо то что тебе нужно
|
|
|
|