PHP 개발 및 다운로드 횟수 통계 기능 모듈 구현(2)
다운로드 작업에 응답하기 위해 download.php 파일을 생성하고, 해당 파일의 다운로드 횟수를 업데이트하고, 브라우저를 통해 다운로드를 완료합니다.
URL에 따라 매개변수를 전달하고, 해당 데이터를 가져오기 위한 쿼리를 수행하고, 다운로드할 파일이 존재하는지 감지합니다. 존재하는 경우 해당 데이터의 다운로드 횟수 +1, 데이터베이스의 파일 다운로드 횟수를 업데이트합니다. +1, header()를 사용하여 다운로드 기능을 구현합니다. 파일이 존재하지 않으면 "파일이 존재하지 않습니다!"가 출력됩니다.
header() 함수를 사용하여 파일을 강제로 다운로드할 수 있으며, 다운로드 후 로컬에 저장되도록 파일 이름을 설정할 수 있다는 점을 언급할 가치가 있습니다.
일반적으로 우리는 업로드된 파일의 이름을 바꾸고 서버에 저장하기 위해 백그라운드 업로드 프로그램을 사용합니다. 이 방법의 장점 중 하나는 파일 이름이 중복되거나 왜곡되는 것을 방지하는 것입니다. . 로컬로 다운로드한 파일의 경우 header("Content-Disposition: attachment; filename=" .$filename)를 사용하여 파일 이름을 쉽게 식별할 수 있는 파일 이름으로 설정할 수 있습니다.
<?php require('conn.php'); $id = (int)$_GET['id']; if(!isset($id) || $id==0) die('参数错误!'); $query = mysqli_query($link,"select * from downloads where id='$id'"); $row = mysqli_fetch_array($query); if(!$row) exit; $filename = iconv('UTF-8','GBK',$row['filename']);//中文名称注意转换编码 $savename = $row['savename']; //实际在服务器上的保存名称 $myfile = 'files/'.$savename; //文件名称 if(file_exists($myfile)){ mysqli_query($link,"update downloads set downloads=downloads+1 where id='$id'"); $file = @fopen($myfile, "r"); header("Content-type: application/octet-stream"); header("Content-Disposition: attachment; filename=" .$filename ); while (!feof($file)) { echo fread($file, 50000); //打开文件最大字节数为50000 } fclose($file); exit; }else{ echo '文件不存在!'; } ?>
참고:
iconv 함수 라이브러리는 다양한 문자 집합 간의 변환을 완료할 수 있으며 PHP 프로그래밍에 없어서는 안 될 기본 함수 라이브러리입니다.
file_exists() 함수는 파일이나 디렉터리가 존재하는지 확인합니다. 지정된 파일이나 디렉터리가 존재하면 true를 반환하고, 그렇지 않으면 false를 반환합니다.
fopen() 함수는 파일이나 URL을 엽니다. 열기에 실패하면 이 함수는 FALSE를 반환합니다. "r"은 읽기 전용 모드로 열리고 파일 포인터가 파일 헤더를 가리킵니다.
feof() 함수는 파일 끝(eof)에 도달했는지 여부를 감지합니다.
fread() 함수는 파일을 읽습니다(바이너리 파일에 안전함).
fclose() 함수는 열려 있는 파일을 닫습니다.