문제

주어진 : 서버에 업로드 된 모든 PDF 파일은 타임 스탬프로 접두사가 있습니다. 나중에 사용자는이 파일을 다시 다운로드 할 수 있습니다. 이 (못생긴) 파일 이름은 서버에서 다시는 변경되지 않습니다.

질문 : PDF 파일을 다운로드 할 수있는 옵션을 제공 할 때 파일 이름이 추악하고 길어 보입니다. 이 이름을 현명한 것으로 변경하여 사용자 가이 파일을 다운로드 할 때 이름이 이상하게 보이지 않도록하려면 어떻게해야합니까?

원본 파일을 바꾸는 것이 옵션이 아니기 때문에 사본을 만들어야합니까? 다운로드 가능한 각 파일에 대해 여분의 오버 헤드가 아닌가? 분명히 복사 된 파일을 삭제하는 것이 또 다른 추가 단계일까요?

클라이언트 측에서 파일이 완전히 다운로드되면 파일 이름을 바꿀 수 있습니까?

당신은 무엇을 제안합니까?

도움이 되었습니까?

해결책

이 같은:

<?php
// We'll be outputting a PDF  
header('Content-type: application/pdf');

// It will be called downloaded.pdf  
header('Content-Disposition: attachment; filename="downloaded.pdf"');

// The PDF source is in original.pdf  
readfile('original.pdf');
?> 

다른 팁

나는 최근 프로젝트를 위해 이것을해야했고 구현 방법에 대해 약간 혼란 스러웠지만 클라우스의 대답을보고 곧 파악했습니다. 클라우스의 반응에 대해 더 자세히 설명하기 위해 :

1) "process.php"라는 파일을 만듭니다. Klaus의 코드를 수정하여 원래 파일 이름과 새 이름의 두 매개 변수를 수락합니다. 내 과정 .php는 다음과 같습니다.

<?php
$file = $_GET['file'];
if (file_exists($file)) {
    header('Content-Description: File Transfer');
    header('Content-Type: application/pdf');
    header('Content-Disposition: attachment; filename='.$_GET['newFile']);
    header('Content-Transfer-Encoding: binary');
    header('Content-Length: ' . filesize($file));
    ob_clean();
    flush();
    readfile($file);
    exit;
}
?>

2) 프로세서 스크립트를 가리키는 사용자를 향한 페이지에 링크를 만듭니다.

<a href="process.php?file=OriginalFile.pdf&newFile=MyRenamedFile.pdf">DOWNLOAD ME</a>

원하는 파일 이름을 설정해야합니다 Content-Disposition 헤더:

$name = 'desiredname.pdf';
header('Content-Disposition: attachment;filename="' . $name . '"');

그러나 불행히도 이것은 레드몬드 팀이 개발 한 특정 웹 브라우저에서 픽업되지 않을 것입니다. 해당 브라우저에서도 작동하려면 요청 경로의 마지막 부분과 동일한 파일 이름을 추가해야합니다. 예를 들어: http://example.com/pdf/desiredname.pdf.

제공된 컨텐츠의 파일 이름은 HTTP 헤더에 정의됩니다. 주위를 둘러보세요 헤더의 PHP 페이지 자세한 정보는 (주석).

나는 얼마 전에 비슷한 일을하고 PHP를 통해 파일을 제공하는 일을하고있었습니다 (제 경우에는 이름을 바꾸지 말고 다운로드 한 사람이 로그인되어 해당 파일을 볼 수 있는지 확인했습니다). PDF 다운로드는 다음과 같은 헤더를 추가하지 않으면 IE에서 작동하지 않는다는 것을 알았습니다.

header('Pragma: public');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Content-Transfer-Encoding: binary');

왜 그런지 잘 모르겠습니다. 실험하고 무슨 일이 일어나는지 확인하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top