내가 한 노력들

[ PHP ] Project 디렉토리에 있는 파일을 Web에서 Download 본문

IT 공부/PHP

[ PHP ] Project 디렉토리에 있는 파일을 Web에서 Download

JONGI-N CHOI 2022. 2. 15. 19:17

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 디렉토리에 있는 파일을 다운로드하는 것이 가능해집니다.