sprawdzenie pobrania pliku

0

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?

0

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.

0

podawaj plik przez php (readfile) i na samym końcu daj zapytanie do bazy zwiększające licznik pobrań - to najbardziej "pewne" rozwiązanie.

0

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ą?

0

dodałem coś takiego

$filename = rawurlencode($_POST['file_name']); 

i działa tylko strasznie brzydkie nazwy daje przy ściąganiu

0

a androidzie nie działa mi readfile() :(
pobiera plik z nazwą strony

0

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');
}
0
 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

2

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?

0

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:)

0
 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

1
header('Content-Disposition: attachment; filename="'.$aFile.'"');
0
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

0
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.