Jak sprawdzić czy zalogowany user pobrał plik?
Można przechwycić zdarzenie i gdzieś to zapisać, ale nie będzie pewności, czy plik został pobrany
jest jakiś inny sposób?
1.Sprawdz przez jquery czy link zostal klikniety jesli tak to uzyj post do jakiegos pliku php ktory ustawi w bazie ze user ze pobral plik.
podawaj plik przez php (readfile)
i na samym końcu daj zapytanie do bazy zwiększające licznik pobrań - to najbardziej "pewne" rozwiązanie.
Zrobiłem coś takiego
if(isset($_POST['file_name'])){
$filepath = 'http://domena/';
$filename = $_POST['file_name'];
$file = $filepath.$filename;
header("Content-Description: File Transfer");
header("Content-Type: application/force-download");
header("Content-Disposition: attachment; filename=".basename($file));
@readfile($file);
exit();
}
//i forms
<form action="<?=$_SERVER['PHP_SELF'];?>" method="post" name="download">
<input name="file_name" value="<?php echo stripslashes($frow['filename']); ?>" type="hidden">
<input type="submit" name = "submit1" value="Zatwierdź">
</form>
i jak działa oki do momentu gdy plik w nazwie nie ma spacji np. plik 2.doc
a w linku jak coś takiego dawałem to ściągało
co zmienić, żeby zapisywał plik ze spacją?
dodałem coś takiego
$filename = rawurlencode($_POST['file_name']);
i działa tylko strasznie brzydkie nazwy daje przy ściąganiu
a androidzie nie działa mi readfile() :(
pobiera plik z nazwą strony
masz tu przekopiowany na zywca fragment, dziala ladnie, tylko podstaw zmienne:
if (preg_match('@^[a-f0-9]{32}$@',$_GET['id'])) { // niepotrzebne Ci
$aFile = files::getByHashedId($_GET['id']); // pobiera z bazy info o pliku
if ($aFile) {
$path = 'content/files/'.$aFile['id_a'].'/'.$aFile['nr'].'/'.$aFile['file'];
header("Content-Type: application/force-download");
header("Content-Description: File Transfer");
header('Content-Disposition: attachment; filename="'.$aFile['filename'].'"');
header("Content-Transfer-Encoding: binary");
header('Content-Length: '.filesize($path));
readfile($path);
//$oFiles->incDownCount($aFile['id']); // to mialo zwiekszac licznik, ale tu jest wykomentowane
die();
}
else {
die('NIEPOPRAWNY ID');
}
}
else {
die('NIEPOPRAWNY ID');
}
if(isset($_POST['file_name'])){
$filepath = 'http://domena/files/';
$aFile = $_POST['file_name'];
$path = $filepath.$filename;
header("Content-Type: application/force-download");
header("Content-Description: File Transfer");
header('Content-Disposition: attachment; filename="'.$aFile['filename'].'"');
header("Content-Transfer-Encoding: binary");
header('Content-Length: '.filesize($path));
readfile($path);
}
przerobiłem tak, ale nie działa
getByHashedId - jest z joomli więc pominąłem ale moze ona binarnie to koduje prawidłowo
filesize chcesz używać na pliku z 'http' w nazwie?
getByHashedId
to moja własna funkcja, nie wiem skąd Ci się tu joomla wymyśliła.
Ogólnie to ja nie wiem. Dałem Ci fajny, działający kod, myślałem, że ogarniasz COKOLWIEK z programowania.
A teraz tworzysz stringa $aFile
, po czym używasz go jak tablicy..
PS. Nazwa pliku na pewno jest w POST?
spojrzałem porannym okiem
poprawiłem i zaczęło działać
jeszcze wieczorem na androidzie sprawdzę
dzięki
ps a getByHashedId wklepałem w google bo nie wiedziałem co robi i wyskoczyło mi, że to z joomli:)
mysql_query('SET NAMES utf8');
mysql_query('SET NAMES utf8 COLLLATE utf8_general_ci;');
$sqlfile = sprintf(
"SELECT * FROM file WHERE news_id = '%s'",
mysql_real_escape_string($id_news)
);
$rfile= mysql_query($sqlfile);
while($frow = mysql_fetch_array($rfile)) {
?>
<?php echo '<font color="gray"><small>'.stripslashes($frow['filename']).'</small></font>'; ?>
<form action="<?=$_SERVER['PHP_SELF'];?>" method="post" name="download">
<input name="file_name" value="<?php echo stripslashes($frow['filename']); ?>" type="hidden" >
<input type="submit" name = "submit1" id="submit" value=""/>
</form>
<?php
//koniec sprawdzenia i wyświetlenia plików
}
?>
i obsługa
if(isset($_POST['file_name'])){
$aFile = $_POST['file_name'];
$filepath = 'admin/files/';
$filename = rawurlencode($_POST['file_name']);
$path = $filepath.$aFile;
header("Content-Type: application/force-download");
header("Content-Description: File Transfer");
header('Content-Disposition: attachment; filename='.$aFile);
header("Content-Transfer-Encoding: binary");
header('Content-Length: '.filesize($path));
readfile($path);
$news = "INSERT INTO download (filename, imie, nazwisko, member_id) VALUES ('$aFile', '$imie', '$nazwisko', '$Ses_member')";
$wykonaj = mysql_query($news);
}
i na operze poprawnie ładuje plik ze spacją, a firefox sobie z tym nie radzi
jak wymusić kodowanie, aby sciągało plik gdzie są polskie znaki i spacje?
plik php zakodowany w UTF-8 bez BOM
jest bład też przy ściąganiu pdf i nie ściąga całego, choć w katalogu jest pełny
header('Content-Disposition: attachment; filename="'.$aFile.'"');
dzek69 napisał(a):
header('Content-Disposition: attachment; filename="'.$aFile.'"');
znowu niedbałość moja
teraz działa pod wszystkim tylko nie pod androidem
nie wiesz jak w androidzie wymusić ściąganie?
z linka ściąga ale przez readfile już nie :(
może dałoby się tak zrobić, żeby po kliknięciu linka zaczął ściągać, a następnie wysłał info do mysql
próbowałem w jquery przejąć kliknięcie, ale jak wrzucić potem do bazy danych info to już pojęcia nie mam, bo nie można w środku jquery wstawić kodu php
if(isset($_POST['file_name'])){
$aFile = $_POST['file_name'];
$filepath = 'admin/files/';
$path = $filepath.$aFile;
// header("Content-Type: application/force-download");
header("Content-Description: File Transfer");
header ("Content-Type: application / octet-stream");
header('Content-Disposition: attachment; filename="'.$aFile.'"');
header("Content-Transfer-Encoding: binary");
header('Content-Length: '.filesize($path));
readfile($path);
}
próbuję i z force download i z octet-stream ale w obydwu przypadkach nie działa na androidzie 4:(
znalazłem tego linka
http://www.digiblog.de/2011/04/android-and-the-download-file-headers/
i z tej strony gdy zapisuje to działa ale jak próbuję zmałpować
header("Content-Type: application/octet-stream");
header("Content-Disposition: attachment; filename="$zipBaseName.ZIP"");
to wychodzi błąd w kodzie
Zarejestruj się i dołącz do największej społeczności programistów w Polsce.
Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.