2013-03-20 5 views
6

현재 phonegap을 사용하여 모바일 앱을 작성 중입니다. 이 앱이 갖고 싶어하는 몇 가지 기능 중 하나는 이미지를 캡처하여 원격 서버에 업로드하는 기능입니다 ...고유 한 파일 이름을 사용하여 PHP를 통해 이미지 업로드

현재 이미지 수집 및 업로드/이메일 전송 부분이 컴파일 된 상태로 작동합니다. apk ...하지만 내 PHP에서, 나는 현재 이미지 "이미지를 [10에서 20까지 임의의 숫자를 삽입한다] 이름을 짓고있다. ... 문제는 숫자가 반복 될 수 있고 이미지를 덮어 쓸 수 있다는 것이다. 읽기만하고 rand()를 사용하고 0에서 getrandmax()까지 임의의 숫자를 선택하는 것에 대해 생각했지만 파일을 덮어 쓰는 동일한 기회를 가질 수 있다고 생각합니다. 이미지를 서버에 업로드해야합니다. 고유 한 이름은 매 시간마다 상관없이 ... PHP 스크립트가 서버가 이미 가지고있는 것을 확인하고 고유 한 이름으로 이미지를 쓰거나 업로드하는지 확인합니다.

"rand()"이외의 다른 아이디어는 있습니까?

각 이미지의 이름을 ... img + date + time + 문자 및 숫자가 포함 된 임의 5 자로 변경하려고 생각했습니다. 앱을 사용하여 4:37 am에 이미지를 찍은 경우 2013 년 3 월 20 일, 이미지는 "img_03-20-13_4-37am_e4r29.jpg"와 같이 서버에 업로드 될 때 이름이 지정됩니다 ... 그게 효과가있을 것이라고 생각합니다 ... (더 좋은 방법은 아니지만)하지만 나는 공정합니다 PHP의 새와 같은 뭔가를 작성하는 방법을 이해하지 못할 ...

내 PHP는 다음과 같다

...

print_r($_FILES); 
$new_image_name = "image".rand(10, 20).".jpg"; 
move_uploaded_file($_FILES["file"]["tmp_name"], "/home/virtual/domain.com/public_html/upload/".$new_image_name); 

어떤 도움에 감사드립니다

... 감사합니다 미리! 또한 더 이상 알려지지 않은 정보가 있으면 알려 주시기 바랍니다.

+0

'$를 new_image_name = "image".microtime(). ".jpg"; "는 IF 2 이미지가 정확히 같은 시간 (초 단위)으로 처리되지 않는 경우에 충분합니다. – Waygood

답변

16

당신은 PHP의 uniqid() 기능을 고려할 수 있습니다 :

또한 여기에 또 다른 방법이다. 당신이 제안 된 코드는 다음과 같을 것이다 이 방법 :

$new_image_name = 'image_' . date('Y-m-d-H-i-s') . '_' . uniqid() . '.jpg'; 
// do some checks to make sure the file you have is an image and if you can trust it 
move_uploaded_file($_FILES["file"]["tmp_name"], "/home/virtual/domain.com/public_html/upload/".$new_image_name); 

는 또한 서버의 임의의 기능이 정말로 무작위하지 ​​않은 점에 유의하십시오. 참으로 무언가가 필요한 경우 random.org을 시도하십시오. 무작위 무작위 무작위.

UPD : 코드에서 random.org를 사용하려면 서버에 대한 일부 API 요청을 수행해야합니다. 이 설명서는 www.random.org/clients/http/에서 확인할 수 있습니다.

호출의 예는 random.org/integers/?num=1&min=1&max=1000000000&col=1&base=10&format=plain&rnd=new입니다. documentation에 설명 된대로 min, max 및 기타 매개 변수를 변경할 수 있습니다.

PHP에서는 file_get_contents() 함수, cURL 라이브러리 또는 소켓을 사용하여 원격 서버에 GET 요청을 할 수 있습니다. 공유 호스팅을 사용하는 경우 발신 연결을 사용할 수 있어야하며 계정에서 사용하도록 설정해야합니다.

$random_int = file_get_contents('http://www.random.org/integers/?num=1&min=1&max=1000000000&col=1&base=10&format=plain&rnd=new'); 
var_dump($random_int); 
+0

+1 멋지게 완료되었습니다. "마이크로 초 단위의 현재 시간을 기준으로" – Waygood

+0

이것은 정말 잘 작동하는 것처럼 보이지만 어떻게 random.org를 통합 할 수 있습니까? 나는 진정한 무작위성에 확실히 관심이있다. – JStormThaKid

1

md5_file을 사용해 보셨습니까? 그런 식으로 모든 파일은 고유 한 이름을 갖게되며 중복 된 이름에 대해 걱정할 필요가 없습니다. 그러나 내용이 같으면 동일한 문자열을 반환합니다.

do { 
    $filename = DIR_UPLOAD_PATH . '/' . make_string(10) . '-' . make_string(10) . '-' . make_string(10) . '-' . make_string(10); 
} while(is_file($filename)); 

return $filename; 

/** 
* Make random string 
* 
* @param integer $length 
* @param string $allowed_chars 
* @return string 
*/ 
function make_string($length = 10, $allowed_chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890') { 
    $allowed_chars_len = strlen($allowed_chars); 

    if($allowed_chars_len == 1) { 
    return str_pad('', $length, $allowed_chars); 
    } else { 
    $result = ''; 

    while(strlen($result) < $length) { 
     $result .= substr($allowed_chars, rand(0, $allowed_chars_len), 1); 
    } // while 

    return $result; 
    } // if 
} // make_string 
+0

그들이 동일하게 불리면 어떨까요? md5_file ('image.jpg') === md5_file ('image.jpg') – Waygood

+0

또는 "image"를 모두 없앨 수 있습니까? print_r ($ _ FILES)와 같은 일을하십시오; $ new_image_name = md5(). ".jpg"; move_uploaded_file ($ _ FILES [ "file"] [ "tmp_name"], "/home/virtual/domain.com/public_html/upload/".$new_image_name); – JStormThaKid

+0

그게 효과가 있니? – JStormThaKid

-1

이미지를 업로드하기 전에 고유 한 이름이 생성됩니다.

// Upload file with unique name 
if (! function_exists('getUniqueFilename')) 
{ 
    function getUniqueFilename($file) 
    { 
     if(is_array($file) and $file['name'] != '') 
     { 
      // getting file extension 
      $fnarr   = explode(".", $file['name']); 
      $file_extension = strtolower($fnarr[count($fnarr)-1]); 

      // getting unique file name 
      $file_name = substr(md5($file['name'].time()), 5, 15).".".$file_extension; 
      return $file_name; 

     } // ends for is_array check 
     else 
     { 
      return ''; 

     } // else ends 

    } // ends 
} 
+0

다른 대답과 마찬가지로, random! = 유일하다. –

+0

또한 동일한 초에 두 번 업로드하면 확실히 문제가 발생할 것입니다. –

+0

FYI :이 대답은 http://stackoverflow.com/questions/24255676/image-upload-with-diffrent-name – Shog9

5

당신은 고유 한 파일 이름을 생성하는 tempnam()을 사용해야합니다

// $baseDirectory Defines where the uploaded file will go to 
// $prefix   The first part of your file name, e.g. "image" 
$destinationFileName = tempnam($baseDirectory, $prefix); 

새 파일의 확장자가 업로드 된 파일을 이동 한 후 수행해야합니다, 예 :

// Assuming $_FILES['file']['error'] == 0 (no errors) 
if (move_uploaded_file($_FILES['file']['tmp_name'], $destinationFileName)) { 
    // use extension from uploaded file 
    $fileExtension = '.' . pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION); 
    // or fix the extension yourself 
    // $fileExtension = ".jpg"; 
    rename($destinationFileName, $destinationFileName . $fileExtension); 
} else { 
    // tempnam() created a new file, but moving the uploaded file failed 
    unlink($destinationFileName); // remove temporary file 
} 
+0

에서 생성 된 .tmp 파일 – user3726268

+0

@ user3726268에서이 답변이 병합되었습니다. 나중에 확장명을 변경하거나 전부 제거하십시오). –

+0

@ user3726268 Btw는'tempnam()'을 사용하는 것이 새로운 파일 이름이 (무작위가 아닌) 유일 할 것이라는 것을 보증하는 유일한 방법입니다. –

관련 문제