2012-12-21 2 views
0

웹 사이트의 클릭 기능에 다운로드 이미지를 추가하려고합니다. 내가 알고있는 한 PHP를 사용하려고 시도하고 있는데, 다른 빈 페이지로 연결하지 않고 HTML로 처리 할 방법이 없다. 그런 다음 다른 이름으로 저장을 클릭하면된다. 이 코드를 여기에서 찾아서 적용하고 싶지만, PHP에 대한 내 이해가 광대하지 않기 때문에이 코드를 깨뜨리는 것에 관심이 있습니다. 또한 여러 파일에서이 코드를 사용해야하지만, PHP에서 사용하는 PHP 파일은 하나의 파일에서만 사용할 수 있습니다. 즉, 각 이미지 다운로드마다 하나씩 많은 PHP 파일이 필요할 수 있습니다.이미지를 클릭하면 다운로드 - PHP를 사용하여

어쨌든, 확실하지 않지만 누구든지 나를 도와 줄 수 있다면 코드를 수정하는 데 도움이 될 수 있습니까? 이미지는 사이트의 다음 디렉토리에 있습니다. /img/bkg/img1.jpg 이것은 img2-5에도 이어집니다. 여기

<a href="download.php?file=path/<?=$row['img1.jpg']?>"> 
    <img src="img/bkg/img1.jpg" alt="CWP - Wallpaper 1" width="1056" height="600"/> 
</a> 

나는 이러한 파일과 올바른 디렉토리에 적응하는 데 필요한 코드 :

어쨌든

, 여기에 PHP 파일 다운로드 이미지와 링크를 보여 주 파일에 사용되는 코드입니다 : 위에서 바보 같은 질문 인 경우

<?php 

$file = $_GET['file']; 

download_file($file); 

function download_file($fullPath){ 

    // Must be fresh start 
    if(headers_sent()) 
    die('Headers Sent'); 

    // Required for some browsers 
    if(ini_get('zlib.output_compression')) 
    ini_set('zlib.output_compression', 'Off'); 

    // File Exists? 
    if(file_exists($fullPath)){ 

    // Parse Info/Get Extension 
    $fsize = filesize($fullPath); 
    $path_parts = pathinfo($fullPath); 
    $ext = strtolower($path_parts["extension"]); 

    // Determine Content Type 
    switch ($ext) { 
     case "pdf": $ctype="application/pdf"; break; 
     case "exe": $ctype="application/octet-stream"; break; 
     case "zip": $ctype="application/zip"; break; 
     case "doc": $ctype="application/msword"; break; 
     case "xls": $ctype="application/vnd.ms-excel"; break; 
     case "ppt": $ctype="application/vnd.ms-powerpoint"; break; 
     case "gif": $ctype="image/gif"; break; 
     case "png": $ctype="image/png"; break; 
     case "jpeg": 
     case "jpg": $ctype="image/jpg"; break; 
     default: $ctype="application/force-download"; 
    } 

    header("Pragma: public"); // required 
    header("Expires: 0"); 
    header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); 
    header("Cache-Control: private",false); // required for certain browsers 
    header("Content-Type: $ctype"); 
    header("Content-Disposition: attachment; filename=\"".basename($fullPath)."\";"); 
    header("Content-Transfer-Encoding: binary"); 
    header("Content-Length: ".$fsize); 
    ob_clean(); 
    flush(); 
    readfile($fullPath); 

    } else 
    die('File Not Found'); 

} 
?> 

내가 미안 해요,하지만 난 오히려 그것을 통해 휴식보다는이의 도움을 요청합니다. 나는 내가 파일과 디렉토리 등을 대체하고있는 곳이 확실하지 않고 그것을 올바르게하고 싶다.

도움을 주시면 감사하겠습니다.

+0

파일 이름이 쿼리 문자열에 전달되며 각 링크의 파일 이름을 변경하면 정상적으로 작동합니까? – adeneo

+0

직접 해보거나 스크립트가하는 일을 적어도 이해해야합니다. 예를 들어, 입력 유효성 검사없이 누군가가 서버에'download.php? file = ../../../ etc/passwd' 큰 문제가있을 수 있습니다. – jeroen

+0

질문에 대해 한 번의 클릭으로 여러 파일을 다운로드 하시겠습니까, 아니면 한 페이지에 여러 번 다운로드 할 수 있습니까? – jeroen

답변

0

스크립트가 잘 한 페이지에 여러 개의 다운로드를 처리합니다, 당신은 많은 추가 할 수 있습니다

<a href="download.php?file=path/<?=$row['img1.jpg']?>"> 

를 페이지로 당신이 원하는대로. 링크를 클릭 할 때마다 스크립트는 전송 한 정보 (예 : file=path/<?=$row['img1.jpg']?>)에 따라 다운로드를 실행하고 처리합니다.

그러나이 스크립트는 입력 유효성 검사가 전혀 없으므로 사람들은 download.php?file=../../../etc/passwd과 같은 요청을 발행하여 시스템 파일을 요청할 수 있습니다.

PHP에서 다시 추가 할 수있는 쿼리 문자열의 경로를 없애고 정규식과 같은 것을 사용하여 변수에 잘못된 문자가 들어 있는지 확인하십시오.

간단한 예를

는 설명하기 :

if (preg_match('#[^\w.-]#', $_GET['file'])) 
{ 
    // if $_GET['file'] contains anything that is not a word character, a dot or a - 
    die("invalid input"); 
} 
else 
{ 
    $file = 'path/' . $_GET['file']; 
    // rest of your code 

나 또한 그렇게 만 JPG 또는 모든 이미지 형식을두고, 사용하지 않는 MIME 형식을 제거하는 것입니다.

+0

안녕하세요, Jerone, 도움에 감사드립니다. :) 코드에 추가했습니다. 비 이미지 관련 파일 유형을 제거했습니다. 이것은 어리석은 것처럼 보일 수 있지만 문제가되는 부분입니다. 정확한 img1.jpg 또는 다른 관련 이미지 파일이 코드에 들어가는 곳이 궁금합니다. 예를 들어, HTML에서 "file = path"라고 말하면 파일에 적응해야하는 파일 경로와 관련이 있습니까? 또는 PHP 명령 또는 함수입니까? 또한 코드에서 % _GET [ 'file']; img1.jpg로 대체 할 '파일'입니까? download.php 문서의 상단 부분과 비슷한? 미안하다면 쓸모없는 것처럼 보일 것입니다. –

+0

@John McPherson 여러분의 링크는'download.php? file = the_image_you_want_to_download_here.jpg'와 같아야하며 php에서 추가하는 경로는 이미지가 저장된 경로 여야합니다 , 실행중인 스크립트에 상대적입니다. – jeroen

관련 문제