Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Automatyczny download
Forum PHP.pl > Forum > PHP
iNTELL
Chciałbym zrobić coś takiego że jak ktoś wchodzi na strone to rozpoczyna się download. To znaczy otwiera mu się okienko czy chce otworzyć plik czy zapisać na dysku. Ale nie wiem jak to zrobić, czy może mi ktoś powiedzieć questionmark.gif Z góry dzięki.
adwol
Cytat
Chciałbym zrobić coś takiego że jak ktoś wchodzi na strone to rozpoczyna się download. To znaczy otwiera mu się okienko czy chce otworzyć plik czy zapisać na dysku. Ale nie wiem jak to zrobić, czy może mi ktoś powiedzieć questionmark.gif Z góry dzięki.

Wsadź taki tag do kodu strony.
[xml:1:1d34750ea8]<meta http-equiv="Refresh" content="1; url=adres_do_downloadu">[/xml:1:1d34750ea8]
iNTELL
Dzięki !!!!!!! To działa, ale jeszcze jedna sprawa, pliki które podaje do tego downloadu są typu *.pdf i zamiast wyświetlić okienka dialogowego co chce zrobić z plikiem to on mi go na hama otwiera w przeglądarce. Da się z tym coś zrobić questionmark.gif
adwol
Cytat
Dzięki !!!!!!! To działa, ale jeszcze jedna sprawa, pliki które podaje do tego downloadu są typu *.pdf i zamiast wyświetlić okienka dialogowego co chce zrobić z plikiem to on mi go na hama otwiera w przeglądarce. Da się z tym coś zrobić questionmark.gif

Jeśli jakiś kod w PHPie zwraca Ci ten dokument to możesz dołożyć nagłówek:
[php:1:d2eae456f3]<?php
header("Content-Disposition: attachment; nazwa_pliku");
?>[/php:1:d2eae456f3]
ale to może nie zadziałać. Tak naprawdę to wszystko zależy od przeglądarki. Twoja najwyraźniej rozpoznaje format PDF i za pomocą jakiegoś plugina próbuje go sama pokazać. Jak ktoś będzie miał inną, która nie rozpoznaje pdf-ów to otworzy się okno do zapisu.
iNTELL
U mnie to wszystko teraz wygląda tak:
[php:1:136015cbf9]<?php
header("Content-Disposition: attachment; $link");
print "<meta http-equiv="Refresh" content="1; url=$link">";
print "Jeśli proces ściągania/otwierania pliku nie nastąpi automatycznie kliknij <A HREF="$link">tutaj</A>.";
?>[/php:1:136015cbf9]

No ale to nie działa. Na 100% jest możliwość zrobienia tego żeby otwierał to okienko bo z niektórych stronek ściągałem pdf'y dzisiaj i się okienko otwierało. Więc jakieś propozycje questionmark.gif
spenalzo
[php:1:61251078d5]<?php
header("Content-Disposition: attachment; $link");
header("Location: ".$link);
?>[/php:1:61251078d5]
iNTELL
Nic z tego, wywala mi tylko 2 błędy jeden pod drugim i dalej otwiera ten plik w przeglądarce.

Te błędy to:

Cytat
Warning: Cannot modify header information - headers already sent by (output started at /druciki/www/phpbb/includes/template.php(127) : eval()'d code:117) in /druciki/www/phpbb/projekty.php on line 170

Warning: Cannot modify header information - headers already sent by (output started at /druciki/www/phpbb/includes/template.php(127) : eval()'d code:117) in /druciki/www/phpbb/projekty.php on line 171
squid
a podaj kod calego pliku php, bo wyglada na to ze wczesnie uzyles jakiegos printa
adwol
Cytat
No ale to nie działa. Na 100% jest możliwość zrobienia tego żeby otwierał to okienko bo z niektórych stronek ściągałem pdf'y dzisiaj i się okienko otwierało. Więc jakieś propozycje questionmark.gif

Nie kod który tworzy tą strone tylko ten który zwraca tego PDFa. Jeśli jest on pobierany bezpośrednio to zachowanie się przeglądarki zależy tylko i wyłącznie od niej samej. Jednym słowem, nie zmienisz sposobu otwierania za pomocą php.
iNTELL
Oto kod: (tylko sie nie przestraszcie biggrin.gif)

[php:1:28dbbb4ed5]
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-2">
</HEAD>
<BODY>
<?



define('IN_PHPBB', true);

$phpbb_root_path = './';

include($phpbb_root_path . 'extension.inc');

include($phpbb_root_path . 'common.'.$phpEx);



//

// Start session management

//

$userdata = session_pagestart($user_ip, PAGE_VIEWMEMBERS);

init_userprefs($userdata);

//

// End session management

//



$start = ( isset($HTTP_GET_VARS['start']) ) ? intval($HTTP_GET_VARS['start']) : 0;



if ( isset($HTTP_GET_VARS['mode']) || isset($HTTP_POST_VARS['mode']) )

{

$mode = ( isset($HTTP_POST_VARS['mode']) ) ? htmlspecialchars($HTTP_POST_VARS['mode']) : htmlspecialchars($HTTP_GET_VARS['mode']);

}

else

{

$mode = 'joined';

}



if(isset($HTTP_POST_VARS['order']))

{

$sort_order = ($HTTP_POST_VARS['order'] == 'ASC') ? 'ASC' : 'DESC';

}

else if(isset($HTTP_GET_VARS['order']))

{

$sort_order = ($HTTP_GET_VARS['order'] == 'ASC') ? 'ASC' : 'DESC';

}

else

{

$sort_order = 'ASC';

}



//

// Memberlist sorting

//

$mode_types_text = array($lang['Sort_Joined'], $lang['Sort_Username'], $lang['Sort_Location'], $lang['Sort_Posts'], $lang['Sort_Email'], $lang['Sort_Website'], $lang['Sort_Top_Ten']);

$mode_types = array('joindate', 'username', 'location', 'posts', 'email', 'website', 'topten');



$select_sort_mode = '<select name="mode">';

for($i = 0; $i < count($mode_types_text); $i++)

{

$selected = ( $mode == $mode_types[$i] ) ? ' selected="selected"' : '';

$select_sort_mode .= '<option value="' . $mode_types[$i] . '"' . $selected . '>' . $mode_types_text[$i] . '</option>';

}

$select_sort_mode .= '</select>';



$select_sort_order = '<select name="order">';

if($sort_order == 'ASC')

{

$select_sort_order .= '<option value="ASC" selected="selected">' . $lang['Sort_Ascending'] . '</option><option value="DESC">' . $lang['Sort_Descending'] . '</option>';

}

else

{

$select_sort_order .= '<option value="ASC">' . $lang['Sort_Ascending'] . '</option><option value="DESC" selected="selected">' . $lang['Sort_Descending'] . '</option>';

}

$select_sort_order .= '</select>';



//

// Generate page

//

$page_title = $lang['Memberlist'];

include($phpbb_root_path . 'includes/page_header.'.$phpEx);



$template->set_filenames(array(

'body' => 'memberlist_body.tpl')

);

make_jumpbox('viewforum.'.$phpEx);

mysql_connect ("xxx", "xxx", "xxx") or

die ("Nie można połączyć się z MySQL");

mysql_select_db ("xxx") or

die ("Nie można połączyć się z bazą drucik");


if ($lin != ''){
$dodaj = 1;
$query = "UPDATE $base SET ilosc=($ilosc + $dodaj) WHERE nr='$lin';";
$wynik = mysql_query ($query);

print "<meta http-equiv="Refresh" content="1; url=$link">";
print "Jeśli proces ściągania/otwierania pliku nie nastąpi automatycznie kliknij <A HREF="$link">tutaj</A>.";


}




$wynik = mysql_query ("SELECT * FROM $base;") or

die ("Błąd w pytaniu");





print("<p align=center>");

print("<font size=7>");

print("$base</font><br><br></p>");






print '<CENTER>Poniżej znajdują się linki do stron wydawnictw z których zaczerpnęliśmy projekty. Pod linkami dostępne są też zdjęcia ostatniego numeru ich gazetki.</CENTER>';
print '<BR><BR>';
print "<TABLE CELLPADDING=5 BORDER=0>";
print '<TR>';
print '<TD><CENTER><A HREF="http://www.ep.com.pl">Elektronika Praktyczna</A><BR><BR><A HREF="http://www.ep.com.pl/?knumer.htm"><IMG SRC="http://www.ep.com.pl/kn/okladka.jpg"></A></CENTER></TD>';
print '<TD><CENTER><A HREF="http://www.edw.com.pl">Elektronika Dla Wszystkich</A><BR><BR><A HREF="http://www.edw.com.pl"><IMG SRC="http://www.edw.com.pl/graphics/0903.jpg" HEIGHT="182" WIDTH="125"></A></CENTER></TD>';
print '</TR>';

print "<TABLE CELLPADDING=5 BORDER=1>";

print "<TR><TD><B>Projekt</B></TD><TD><b>źródło</B></TD><TD><B>Ilość<BR>ściągnięć</B></TD><BR>";











while ($rekord = mysql_fetch_array ($wynik)) {

$id = $rekord[0];

$projekt = $rekord[1];

$zrodlo = $rekord[2];

$link = $rekord[3];

$ilosc = $rekord[4];

print "<TR><TD>$projekt</TD><TD>$zrodlo</TD><TD>$ilosc</TD><TD><A Href="projekty.php?base=$base&lin=$id&projekt=$projekt&zrodlo=$zlodlo&ilosc=$ilosc&link=$link">Zobacz</A></TD></TR>n";


}



print "</TABLE>";
?>
</BODY>
</HTML>

[/php:1:28dbbb4ed5]
FiDO
Cytat
Nie kod który tworzy tą strone tylko ten który zwraca tego PDFa. Jeśli jest on pobierany bezpośrednio to zachowanie się przeglądarki zależy tylko i wyłącznie od niej samej. Jednym słowem, nie zmienisz sposobu otwierania za pomocą php.

Ale w czym problem aby zrobic tak:
Kod
<meta http-equiv="Refresh" content="1; url=dl.php?p=plik.pdf">

W pliku dl.php wyslac najpierw odpowednie naglowki, a potem readfile() na pliku. Oczywiscie warto sie zabezpieczyc i ograniczyc mozliwosc sciagania plikow tylko z danego katalogu, zeby ktos czasem nie podal linka dl.php?p=/etc/passwd lub cos podobnego...
iNTELL
A mógłby mi ktoś mniej więcej napisać jaki kod powinien siedzieć w tym dl.php questionmark.gif
FiDO
[php:1:d7d465b68a]
<?php

$file = './files/'.$_GET['file'];

header("Cache-control: private");
header("Content-Type: application/octet-stream");
header("Content-Length: ".filesize($file));
header("Content-Disposition: attachment; filename=".basename($file));
header("Connection: Close");

readfile($file);
?>
[/php:1:d7d465b68a]
Do tego doloz sprawdzanie wczesniej czy z dozwolonego katalogu plik leci i bedziesz mial.
Michal_K
Nie prościej spakować pdf-y do zipa?
wassago
przeczytaj pierwszy post i pomysl...
iNTELL
hehe, już lepiej ale są i tak niezłe jaja, co prawda wyświetla mi pytanie czy zapisać czy nie zapisać, ale on chce zapisać plik dl.php smile.gif a to troche nie tak smile.gif Co z tym fantem zrobić questionmark.gif
FiDO
Cos musiales spaprac, bo ten kod co podalem z powodzeniem uzywam i dziala... Pokaz caly plik dl.php.
iNTELL
Wszystko okej, śmiga aż miło. Ja sknociłem podając błędną zmienną biggrin.gif, tylko denerwuje mnie troche to ża jak zapisuje to mam podany typ pliku jako Dokument Tekstowy, czemu tak jest questionmark.gif
spenalzo
Bo php jest dokumentem tekstowym :-P
delorian
Dobra Panowie, wszystko pięknie, tylko powiedzcie czemu powyższe rozwiązanie nie działa dla dużych plików. Czytając manual znalazłem, że do czytania dużych plików zamiast readfile powinno się używać funkcji fread. Tak też zrobiłem. I oto co otrzymałem:

Plik test.html wyglada nastepująca:

Kod
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2">

<meta http-equiv="Refresh" content="1; url=download.php?file=plik.zip">

<body>

Tutaj nic szczególnego.

...


Oraz plik download.php:

[php:1:e088c7ed51]

if($_GET['file']) { // jeœli podałeœ linka do pliku
$sFileName = preg_replace("|..|","",$_GET['file']);

if(@file_exists($sFileName)) { // jesli plik istnieje


header("Expires: ".gmdate("D, d M Y H:i:s", mktime(date("H")+1, date("i"), date("s"), date("m"), date("d"), date("Y")))." GMTS");
header("Cache-control: Private");
header("Content-type: application/octet-stream");
header("Content-transfer-encoding: binaryn");
header("Content-Disposition: attachment; filename=".$sFileName);
header("Content-Description: ".$sFileName);
header("Content-length: ".(string)(@filesize($sFileName)));
header("Connection: close");

if ($rFile = @fopen($sFileName, 'rb')) {
while(!feof($rFile)) {
print(fread($rFile, 1024*8));
flush();
}
@fclose($file);
}


} else {
echo "<p>Błšd! Plik o podanej nazwie nie istnieje.</p>";
}

} else { // jeœli nie podałeœ linka to zgłoœ komunikat błędu
echo "<p>Błšd! Nie podałeœ nazwy pliku do œcišgnięcia.</p>";
}
[/php:1:e088c7ed51]

No i wszystko działa cacy, gdy odbieram jakiekolwiek pliki, testowane na kilku przeglądarkach no i też jest dobrze. Jednak przy plikach większych niż kilka mega nie ciągnie mi całego pliku. I to wszystko w zależności od prędkości łącza. U mnie idzie za 20MB pliku jakieś 2-4 mega i się urywa. U mojego kolegi na szybszym łączu idzie 8MB, a na serwerze ciągnie mi cały plik. Nie wiem gdzie leży błąd. Dodatkowo testowałem na kilku serwerach, na jednym zupełnie nie chciało działać, na jednym idze ale też nie do końca. Może to kwestia max_execution_time, ale i tak ściąga się o 4 minuty dłużej niż jest ustawione. Dodatkowo nie przesyłam przecież wszystkiego na raz tylko w 8 kilowych pakietach.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.