project 디렉토리에 있는 csv 파일을 Web상에서 유저가 다운로드할 수 있도록 구현했습니다.
<? php
$fullPath = 'C:/xampp/htdocs/Local-AWS-scraping/writable/uploads/csv/bbbb.csv';
$fileName = 'newnewFile.csv';
$size = filesize($fullPath);
header("Content-Disposition: attachment; filename=$fileName");
header("Content-Length: ".$size);
header("Content-Type: text/csv; ");
$file = fopen('php://output', 'w');
fputs($file, file_get_contents($fullPath));
fclose($file);
?>
Content-Disposition
응답 Body를 브라우저가 어떻게 표시해야할지 알려준다.
- inline 옵션 - 파일을 웹페이지에 표시한다. 웹페이지 표시가 지원되지 않는 파일은 다운로드 예) Content-Disposition: inline
- attachment 옵션 - 파일을 다운로드하고, filename 옵션으로 파일명까지 지정해줄 수 있다. 예) Content-Disposition: attachment; filename='filename.csv'
Content-Length
- HTTP 요청에서 Content-Length는 선택사항입니다.
- GET 또는 DELETE의 경우 길이가 0이어야 합니다.
- POST의 경우, Content-Length가 지정되고 메시지 행의 길이와 일치하지 않으면 메시지는 잘리거나 지정된 길이까지 널로 채워집니다.
- Content-Length는 컨텐츠가 없는 경우(값이 0인 경우)에도 항상 HTTP 응답에서 리턴됩니다.
Content-Type
말그대로 Content의 Type을 지정해줍니다. MIME 포맷이 사용되는데
mime이란, 전자 우편을 위한 인터넷 표준 포맷이다.
mime 타입 확인
https://developer.mozilla.org/ko/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Common_types
그리고, PHP의 mime_content_type(string filename)을 사용하게되면 해당 파일의 mime타입을 확인할 수 있습니다.
fopen('php://output', 'w')
- php://output은 print() 와 echo() 같은 출력 버퍼 메카니즘에 대한 쓰기 권한을 허용한다.
- w는 파일쓰기 모드인데, 기존 파일이 없다면 생성하고 있으면 덮어쓰기를 합니다. 추가하고 싶은 경우에는 a를 사용하면 되고, 그 외에도 다양한 모드가 존재합니다.
fputs($file, file_get_contents($fullPath))
새로운 파일(유저가 다운로드할 파일)에 directory에 있는 파일 ( $fullPath)의 내용을 넣어주는 과정
fputs 사용법
예) fputs(file,string,length)
file | 필수, 파일을 지정합니다 |
string | 필수, 파일에 작성할 문자열 |
length | 선택 옵션, 최대 바이트 수를 쓰기를 지정합니다 |
file_get_contents 사용법
file_get_contents(
string $filename,
bool $use_include_path = false,
?resource $context = null,
int $offset = 0,
?int $length = null
) : string|false
filename | 읽을 파일 이름 |
use_include_path | |
context | |
offset | 원본 스트림에서 읽기가 시작되는 오프셋입니다. 음수 오프셋은 스트림 끝에서 계산됩니다. |
length | 읽은 데이터의 최대 길이입니다. 기본값은 파일 끝에 도달할 때까지 읽는 것입니다. 이 매개변수는 필터에 의해 처리되는 스트림에 적용됩니다. |
그러면, 이제 브라우저상에서 project 디렉토리에 있는 파일을 다운로드하는 것이 가능해집니다.
'IT 공부 > PHP' 카테고리의 다른 글
[ PHP ] 디렉토리(폴더)에 있는 파일 리스트 가져오기 (0) | 2022.02.20 |
---|---|
[ PHP ] Pagination (페이징) 구현 (0) | 2022.02.16 |
[ PHP ] CSV파일 불러와서 웹에 Table 형태로 뿌려주기 (0) | 2022.02.15 |
[ AWS ] EC2에서 Docker 기반, nginx-php환경 구축후 RDS 연결하기 (0) | 2022.01.29 |
2020-12-02 PHP 공부정리 (0) | 2020.12.02 |