문제

나는 "딜레마"가 있고 비즈니스 모범 사례가 무엇인지 궁금합니다.

업로드를 사용하여 이미지를 업로드하고 있습니다. 이제 파일을 저장하기 전에 파일 이름을 검증해야합니다.

나는 다른 솔루션을 보았지만 하나의 좋은 솔루션을 얻을 수는 없습니다.

내 기준은 다음과 같습니다.

  • 파일 이름은 모두 소문자에 있어야합니다
  • 파일 이름은 charaters 만 포함 할 수 있습니다 [A-Z0-9_-
  • 파일 이름을 바꿀 수 있어야합니다

파일 이름이 있으면 어떻게 하시겠습니까? my.file(name).jpeg ?

파일 이름을 폭발시킬 수 있습니다. 확장을 저장 한 다음 파일 이름을 다시 얻도록 간청하십시오. 그러나 그것이 최고의 해결책인지 확실하지 않습니다.

약간 도움이되는 다음 기능이 있습니다.

function getExts($filename) 
{ 
    $exts = explode("[/\\.]", $filename) ; 
    $n = count($exts)-1; 
    $exts = $exts[$n]; 
    return $exts; 
}

function validFilename($filename)
{
    $filename = str_replace(" ", "_", $filename);
    $pattern = "/[^[a-z0-9_-]/";
    return preg_replace($pattern, "", strtolower($filename));
} 

업데이트 1
$ _files를 통해 파일을 받고 있습니다. 이것은 다음 데이터를 제공합니다.

  • $ _files [ "파일"] [ "이름"] - 업로드 된 파일의 이름
  • $ _files [ "파일"] [ "유형"] - 업로드 된 파일의 유형
  • $ _files [ "파일"] [ "크기"] - 업로드 된 파일의 바이트 크기
  • $ _files [ "file"] [ "tmp_name"] - 서버에 저장된 파일의 임시 사본 이름
  • $ _files [ "file"] [ "Error"] - 파일 업로드에서 발생하는 오류 코드

업데이트 2
방금 뭔가를 찾았습니다. 나는 사용할 수있다 getimagesize 7 개의 요소 배열을 반환합니다. 이러한 요소 중 하나는 [2]는 imageType_xxx입니다.

그래서이 코드를 사용해보십시오.

function getExts2($filename)
{
    list(,,$type) = getimagesize($filename);
    return $type;
}

그러나 그것은 단지 2 번만 반환합니다 ...

(나는 또한 exif_imagetype를 사용해 보았지만 PHP 오류 : 정의되지 않은 함수로 호출합니다.)

도움이 되었습니까?

해결책

Regexp로 filename을 확인하십시오. Mimetype에 대한 정보를 사용하십시오. MD5 이름으로 서버에 파일을 저장합니다. DB에 실제 파일 이름을 저장하십시오.

다른 팁

pathinfo () 파일 이름과 확장자를 얻을 수 있습니다. 그러나 파일 이름 검사를 통해 파일의 확장 테스트에 의존 할 수 없다고 경고합니다. 파일의 이진 내용을 실제로 검사하는 함수를 사용하려고합니다. finfo_file () 이것을 달성 할 수 있습니다. 아, 그리고 사용하는 것은 결코 아프지 않습니다 베이스 이름 () 경로 트래버스 공격을 방지하기 위해 사용자가 제공 한 파일 경로에서.

나중에 다운로드 파일 이름으로 사용하기 위해 파일 이름을 확인하고 있다고 가정합니다.

기술적 인 관점에서 사용자를 위해 파일 이름을 보존하는 것이 좋지만 접근 방식은 소리가 들립니다.

URL의 모습에 관심이 있고 앞으로 국제적인 청중을 대상으로 할 수 있다면 Umlauts를 기본 캐릭터로 변환하거나 변환해야합니다. 독일 사용자 (Umlauts ä Ö ü ß)는 전환을 기대할 것입니다.

Ä = ae
Ö = oe
Ü = ue

스칸디나비아 사람들은 편안한 것 같습니다

Ä => a
Ö => o
Ø => o

등등.

그런 다음 다양한 악센트 캐릭터가 있습니다 é Á Ó ...

그것들을 모두 떨어 뜨리면 외관이있는 URL로 이어집니다 진짜 BWSR 주소 BR의 BD 및 LOK STRNG.

이것은 당신이 원하는 모든 것을해야합니다.

$filename = preg_replace('/[^[a-z0-9_-]/', '', str_replace(' ', '_', strtolower(pathinfo($filename, PATHINFO_FILENAME)))) . pathinfo($filename, PATHINFO_EXTENSION);

Pekka가 설명했듯이 파일 이름으로 모든 강조를 대체하려면 다음 기능을 사용할 수 있습니다.

function Unaccent($string)
{
    return preg_replace('~&([a-z]{1,2})(acute|cedil|circ|grave|lig|orn|ring|slash|th|tilde|uml);~i', '$1', htmlentities($string, ENT_QUOTES, 'UTF-8'));
}

나는 당신이 파일 이름을 "검증"해야한다고 생각하지 않으며, 원하는 형식이 아닌 경우 "수정"해야합니다. 누군가가 파일의 이름을 지정하는 데 짜증을 내거나 특이한 캐릭터가 있기 때문에 파일을 거부하는 이유는 무엇입니까? 또한 이미지로 작업하는 경우 사용할 수 있습니다. getimagesize 실제로 업로드 된 이미지인지 확인하기 위해 언급했듯이 (이미지가 아닌 경우 실패해야합니다).

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