PHP에서 고유하고 임시적인 파일 이름?
일부 파일을 PDF로 변환한 후 이메일에 첨부해야 합니다.저는 이메일 측면에서 Pear Mail을 사용하고 있으며, 그것은 문제가 없지만(대부분은 여전히 해결 중입니다), 그 일환으로 임시 파일을 만들어야 합니다.이제 tempnam() 기능을 사용할 수 있지만 파일 시스템에 파일을 생성하는 것처럼 들립니다. 이것은 제가 원하는 것이 아닙니다.
저는 임시 파일 시스템(sys_get_temp_dir() 사용)에서 스크립트를 두 번 이상 호출하는 동일한 사용자의 동일한 스크립트를 실행하는 다른 사용자와 충돌하지 않는 이름을 원합니다.
제안?
나는 과거에 고유한 파일 이름을 생성하기 위해 uniid()를 사용했지만 실제로 파일을 만들지는 않았습니다.
$filename = uniqid(rand(), true) . '.pdf';
첫 번째 매개 변수는 원하는 모든 매개 변수가 될 수 있지만, 여기서는 rand()를 사용하여 조금 더 랜덤하게 만들었습니다.설정된 접두사를 사용하면 시스템의 다른 임시 파일과의 충돌을 방지할 수 있습니다.
$filename = uniqid('MyApp', true) . '.pdf';
여기서 파일을 생성하면 됩니다.다른 방법이 모두 실패하면 잠시 루프에 넣고 작동하는 루프를 얻을 때까지 계속 생성합니다.
while (true) {
$filename = uniqid('MyApp', true) . '.pdf';
if (!file_exists(sys_get_temp_dir() . $filename)) break;
}
tempnam()을 사용하십시오.예, 이렇게 하면 파일이 생성되지만 이는 시스템의 다른 프로세스가 사용자의 파일 이름을 "도둑질"하여 사용자가 원하지 않는 파일을 덮어쓰는 것을 방지하기 위해 고안된 매우 의도적인 보안 조치입니다.
즉, 다음 순서를 고려합니다.
- 임의의 이름을 생성합니다.
- 파일 시스템이 존재하지 않는지 확인합니다.그러면 이전 단계를 반복합니다.
- 또 다른 악의적인 프로세스는 이블 씨가 실수로 덮어쓰게 하려는 파일에 대한 하드 링크와 동일한 이름의 파일을 만듭니다.
- 기존 파일을 쓰기 모드로 열기보다는 파일을 만드는 것으로 생각하고 파일에 쓰기를 시작합니다.
- 당신은 방금 중요한 것을 남발했어요.
PHP의tempnam()
실제로 시스템의mkstemp()
후드 아래(리눅스용)"best practice" 기능을 다른 OS로 대체합니다. 이 기능은 다음과 같은 프로세스를 거칩니다.
- 파일 이름 선택
- 다른 사용자가 소유하지 않은 파일을 제거하지 못하도록 하는 디렉토리 내에 제한적인 사용 권한을 가진 파일을 만듭니다(스티키 비트가 수행하는 작업).
/var/tmp
그리고./tmp
) - 생성된 파일에 여전히 제한적인 권한이 있는지 확인합니다.
- 위의 항목 중 하나라도 실패하면 다른 이름으로 다시 시도하십시오.
- 만든 파일 이름을 반환합니다.
이제 이러한 모든 작업을 직접 수행할 수 있지만, "적절한 기능"이 보안 임시 파일을 만드는 데 필요한 모든 작업을 수행하는 경우에는 거의 항상 빈 파일을 생성해야 합니다.
예외:
- 프로세스에서만 파일을 만들거나 삭제할 수 있는 디렉토리에 임시 파일을 만드는 중입니다.
- 임의로 생성된 임시 디렉터리를 만듭니다. 이 디렉터리에서 파일을 만들거나 삭제할 수 있습니다.
PHP 기능 http://www.php.net/tempnam 을 사용하는 것을 추천합니다.
$file=tempnam('tmpdownload', 'Ergebnis_'.date(Y.m.d).'_').'.pdf';
echo $file;
/var/www/html/tmpdownload/Ergebnis_20071004_Xbn6PY.pdf
또는 http://www.php.net/tmpfile
<?php
$temp = tmpfile();
fwrite($temp, "writing to tempfile");
fseek($temp, 0);
echo fread($temp, 1024);
fclose($temp); // this removes the file
?>
▁on안에 한 또 다른 .@Lusid
최대 실행 시간의 페일오버로 응답:
// Max exectution time of 10 seconds.
$maxExecTime = time() + 10;
$isUnique = false;
while (time() !== $maxExecTime) {
// Unique file name
$uniqueFileName = uniqid(mt_rand(), true) . '.pdf';
if (!file_exists(sys_get_temp_dir() . $uniqueFileName)){
$isUnique = true;
break;
}
}
if($isUnique){
// Save your file with your unique name
}else{
// Time limit was exceeded without finding a unique name
}
참고:
사용하는 것을 선호합니다.
mt_rand
에rand
번째 는 첫번째함사때용기문다니입되가수를 사용하기 입니다.Mersenne Twister algorithm
그것은 .LCG
).
추가 정보:
- http://php.net/manual/en/function.uniqid.php
- http://php.net/manual/en/function.mt-rand.php
- http://php.net/manual/en/function.time.php
파일 이름에 UUID를 사용해 보십시오.고유 함수를 고려합니다.http://php.net/uniqid
날짜와 시간의 일부를 사용하여 고유한 파일 이름을 만들 수 있습니다. 이렇게 하면 파일 이름이 두 번 이상 호출될 때 중복되지 않습니다.
사용자 ID와 함께 Unix 타임스탬프를 사용하는 것이 좋습니다.
$filename='file_'.time().'_'.$id.'.jepg';
제 생각은 재귀 함수를 사용하여 파일 이름이 존재하는지 확인하고, 존재하면 다음 정수로 반복하는 것입니다.
function check_revision($filename, $rev){
$new_filename = $filename."-".$rev.".csv";
if(file_exists($new_filename)){
$new_filename = check_revision($filename, $rev++);
}
return $new_filename;
}
$revision = 1;
$filename = "whatever";
$filename = check_revision($filename, $revision);
function gen_filename($dir) {
if (!@is_dir($dir)) {
@mkdir($dir, 0777, true);
}
$filename = uniqid('MyApp.', true).".pdf";
if (@is_file($dir."/".$filename)) {
return $this->gen_filename($dir);
}
return $filename;
}
2020년 업데이트
hash_file('md5', $file_pathname)
이렇게 하면 중복이 방지됩니다.
언급URL : https://stackoverflow.com/questions/460164/unique-and-temporary-file-names-in-php
'itsource' 카테고리의 다른 글
Spring MVC: @RequestParam과 @ModelAttribute의 차이점을 설명하십시오. (0) | 2023.07.26 |
---|---|
Python에서 XML 스키마로 검증 (0) | 2023.07.26 |
거부된 요청을 가로채는 방법봄에는 예외? (0) | 2023.07.26 |
장고 버전 및 데이터베이스 지원(MariaDB) (0) | 2023.07.26 |
반환된 데이터의 최대 크기 (0) | 2023.07.26 |