2010-04-25 2 views
0

내 웹 사이트에 사용자가 제출 한 기사를 추가하려고합니다 (관리자 만 해당). 각 기사에는 최대 3 개의 이미지를 업로드 할 수있는 옵션이 있습니다. 내 데이터베이스는 다음 나는 새로운 사진을 만들이업로드 된 파일을 덮어 쓰지 않도록 파일 이름을 지정하는 방법은 무엇입니까?

기사처럼

id 
user_id 
title 
body 
date_added 
last_edited 

사진

id (auto_increment) 
article_id 

먼저 그때 내가 (일시적으로) 사진을 업로드, 데이터베이스에 문서를 저장을 설정 article_id를 저장하는 데이터베이스에 기록하십시오. 그런 다음 업로드 한 사진의 이름을 사진 기록의 기본 키와 동일하게 변경하고 png로 변경합니다.

$filename = $photo->id . '.png';

나는이 덮어 쓰는 형태의 파일을 방지하는 좋은 방법이 될 것입니다 생각. 이것은 나에게 결함이있는 것 같다. 내 기록과 사진을 어떻게 저장해야하는지에 대한 제안 사항이 있습니까? 그

+0

무엇이 문제입니까? – Ben

+0

* (참고) * http://de3.php.net/manual/en/function.uniqid.php – Gordon

답변

1

.

내가보기에 유일한 진짜 단점은 상당히 쓸모없는 파일 이름으로 끝나는 것입니다. 누군가는 검색 엔진 순위 등을 설명하는 데 더 도움이되는 이름을 사용하면 도움이 될 것입니다.

또 다른 대답으로 지적하면 .png로 끝나는 파일의 이름을 변경해도 png가되지는 않습니다. 실제로 이미지 포맷을 변환하고 싶다면 PHP의 빌트인 GD 라이브러리 (또는 ImageMagick 검색)를 살펴볼 수있다.

+0

거기에 진정한 단어가 있습니다. – Ben

1

해시

감사합니다.

PHP의 MD5 기능을 사용하여 이미지를 갤러리에 업로드 할 때 이미지를 해싱했습니다. 두 가지 주요 이점이 있습니다. 서로 다른 이미지는 서로 덮어 쓰지 않으며 동일한 이미지 입니다. 즉, 각각의 고유 한 그림은 고유 한 이름을 갖게됩니다. 업로드를 수락하고 저장된 데이터를 해시하고 파일 이름 (hash.extension)을 작성하고 기존 파일을 확인하십시오. 존재하는 경우 임시 파일을 삭제하고 기존 사본을 사용하십시오. 그렇지 않으면 임시 파일의 이름을 바꾸지 말고 보관하십시오. 각 파일에 무엇이 연결되어 있는지 추적해야 할 수도 있지만 (중복 사용에 많은 공간을 절약 할 수 있고 고유 한 이름을 쉽게 얻을 수 있습니다.

또한 PNG 확장명을 사용하도록 파일 이름을 바꿀 수 없으며 PNG 형식으로 변환하거나 원래 확장명을 저장해야합니다. 잘못된 확장자를 사용하면 일부 장소 및 일부 브라우저에서 문제가 발생할 수 있으며 일반적으로 올바르지 않습니다.

+0

이것은 확실히 고려해 볼 가치가 있습니다. 동일한 파일의 사본을 여러 개 (한 사용자의 삭제로 모두 삭제되지 않도록)하는 것이 편리 할 수있는 경우와 실제 파일 내용으로 고유 한 공간을 정의하는 특성이 매우 유용 할 수있는 경우가 있습니다 . –

1

가치있는 점은 기존 파일을 덮어 쓰지 않도록 클래스를 업로드하는 파일을 포함시키는 방법입니다. 업로드 파일 이름 ($ _FILES [$ img_field] [ "name"])과 디렉토리를 매개 변수로 저장하여 일반적인 방법으로 남겨 둡니다. 단지 파일 이름을 데이터베이스 기본 키를 사용하여 정말 아무 문제가 없습니다

private function unique_file_upload($filename, $dir) { 
     $filename = preg_replace("/[^.\w]/",'_',$filename); 
     $filename = preg_replace("/__+/",'_',$filename); 
     preg_match("/^(.*)\.(\w{2,4})$/",$filename,$f); 
     if (file_exists($dir . $filename)) { 
      $num = 1; 
      while (file_exists($dir . $filename)) { 
       preg_match("/^(.*)\.(\w{2,4})$/",$filename,$f); 
       preg_match("/(\d+)$/",$f[1],$n); 
       if ($n[1]) { 
        $x = $n[1]; 
        $num = $n[1] + 1; 
        $num .= '.'; 
        $filename = preg_replace("/$x\./",$num,$filename); 
       } 
       else { 
        $filename = $f[1] . $num . '.' . $f[2]; 
       } 
      } 
     } 
     return $filename; 
    } 
1

이미지가 자동 증가 기본 키를 이름으로 사용하는 경우 동일한 이름을 가진 두 개의 이미지가있을 가능성은 전혀 없습니다.

이름에서 고유성을 보장하기 위해 해싱하거나 추가 작업을하는 것은 쓸모가 없습니다. 더군다나 DB에 여분의 이미지 이름 필드를 추가하는 것을 의미합니다.

DB 자동 증가 카운터를 재설정하고 테이블의 이전 레코드를 삭제해야하거나 카운터가 다시 DBMS에서 가장 높은 ID로 다시 계산해야하는 경우 이미지가 과도해질 수있는 유일한 방법입니다. 테이블에 기록하십시오.

즉, 알고리즘을 사용하면 같은 이름의 이미지가 2 개 없을 것입니다.

0

적절한 방법은 관련 레코드의 기본 키 ID를 사용하여 파일을 저장하는 것입니다. "그다음 쓸모없는 숫자"를 처리하기 위해 "사진"테이블에 원본 파일 이름을 저장할 수 있습니다. 여러 이미지 유형을 허용하는 경우 마임 유형도 저장할 수 있습니다.

그런 다음 데이터베이스에서 파일 이름을 검색하고 Content-disposition: attachment; filename=$filename 헤더를 사용하여 클라이언트에 제공하는 간단한 스크립트를 사용합니다. 이렇게하면 서버의 파일 이름이 "3527"이더라도 클라이언트는 "originalimagefilename.jpg"또는 기타의 다운로드를 보게됩니다.

관련 문제