2013-03-20 38 views
6

Tôi hiện đang trong quá trình viết ứng dụng dành cho thiết bị di động với sự trợ giúp của thẻ SIM. Một trong số ít tính năng mà tôi muốn ứng dụng này có là khả năng chụp ảnh và tải nó lên máy chủ từ xa ...tải lên hình ảnh qua php bằng cách sử dụng tên tệp duy nhất

Tôi hiện đang chụp ảnh và tải lên/gửi email phần làm việc tốt với một biên dịch apk ... nhưng trong php của tôi, tôi hiện đang đặt tên cho hình ảnh "hình ảnh [chèn số ngẫu nhiên từ 10 đến 20] ... Vấn đề ở đây là các số có thể được lặp lại và hình ảnh có thể bị ghi đè ... Tôi có đọc và suy nghĩ về chỉ bằng cách sử dụng rand() và chọn một số ngẫu nhiên từ 0 đến getrandmax(), nhưng tôi cảm thấy rằng tôi có thể có cùng một cơ hội ghi đè lên một tập tin ... Tôi cần hình ảnh được tải lên máy chủ với một tên duy nhất mọi lúc, bất kể điều gì ... do đó, tập lệnh php sẽ kiểm tra xem máy chủ đã có và ghi/tải hình ảnh lên với một tên duy nhất ...

bất kỳ ý tưởng nào khác ngoài "rand()"?

Tôi cũng đang nghĩ về việc đặt tên cho từng hình ảnh ... img + date + time + random 5 ký tự, bao gồm chữ cái và số ... vì vậy nếu một hình ảnh được chụp bằng ứng dụng lúc 4:37 sáng Ngày 20 tháng 3 năm 2013, hình ảnh sẽ được đặt tên là "img_03-20-13_4-37am_e4r29.jpg" khi được tải lên máy chủ ... Tôi nghĩ rằng có thể hoạt động ... (trừ khi có cách tốt hơn) nhưng tôi khá mới để php và sẽ không hiểu làm thế nào để viết một cái gì đó như thế ...

php của tôi là như sau ...

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); 

Any help is appreciated ... Cảm ơn trước! Ngoài ra, vui lòng cho tôi biết nếu có bất kỳ thông tin nào khác mà tôi có thể rời khỏi ...

+0

'$ new_image_name = "image" .microtime(). ". jpg"; 'đủ cho nhu cầu của bạn NẾU 2 ảnh không được xử lý chính xác cùng lúc (phần nhỏ của giây). – Waygood

Trả lời

16

Bạn có thể muốn xem xét uniqid() chức năng của PHP. Bằng cách này mã bạn đề nghị sẽ trông giống như sau:

$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); 

Cũng nên nhớ rằng chức năng ngẫu nhiên của máy chủ của bạn không thực sự ngẫu nhiên. Hãy thử random.org nếu bạn cần một cái gì đó thực sự ngẫu nhiên. Ngẫu nhiên ngẫu nhiên ngẫu nhiên.

UPD: Để sử dụng random.org từ bên trong mã của bạn, bạn sẽ phải thực hiện một số yêu cầu API cho máy chủ của họ. Tài liệu trên đó có sẵn tại đây: www.random.org/clients/http/.

Ví dụ về cuộc gọi sẽ là: random.org/integers/?num=1&min=1&max=1000000000&col=1&base=10&format=plain&rnd=new. Lưu ý rằng bạn có thể thay đổi các thông số min, max và các thông số khác, như được mô tả trong documentation.

Trong PHP, bạn có thể thực hiện yêu cầu GET tới máy chủ từ xa bằng cách sử dụng chức năng file_get_contents(), thư viện cURL hoặc thậm chí là ổ cắm. Nếu bạn đang sử dụng lưu trữ được chia sẻ, các kết nối gửi đi sẽ khả dụng và được bật cho tài khoản của bạn.

$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 được thực hiện tốt. "dựa trên thời gian hiện tại tính bằng micro giây" – Waygood

+0

điều này dường như hoạt động thực sự tốt, nhưng làm thế nào tôi có thể tích hợp random.org? Tôi chắc chắn quan tâm đến sự ngẫu nhiên thực sự – JStormThaKid

1

Bạn đã xem xét sử dụng md5_file? Bằng cách đó, tất cả các tệp của bạn sẽ có tên duy nhất và bạn sẽ không phải lo lắng về tên trùng lặp. Nhưng xin lưu ý rằng điều này sẽ trả về cùng một chuỗi nếu nội dung giống nhau.

Ngoài ra đây là một phương pháp khác:

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

nếu chúng được gọi giống nhau thì sao? md5_file ('image.jpg') === md5_file ('image.jpg') – Waygood

+0

hoặc có thể tôi loại bỏ "hình ảnh" cùng nhau? làm một cái gì đó như print_r ($ _ FILES); $ new_image_name = md5(). ". Jpg"; move_uploaded_file ($ _ FILES ["tệp"] ["tmp_name"], "/home/virtual/domain.com/public_html/upload/".$new_image_name); – JStormThaKid

+0

có hoạt động không? – JStormThaKid

-1

Chức năng sẽ tạo tên duy nhất trước khi tải lên hình ảnh.

// 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

Như với câu trả lời khác, ngẫu nhiên! = Duy nhất. –

+0

Ngoài ra, hai video tải lên trong cùng một giây chắc chắn sẽ gây ra sự cố. –

+0

FYI: câu trả lời này đã được hợp nhất từ ​​http://stackoverflow.com/questions/24255676/image-upload-with-diffrent-name – Shog9

5

Bạn nên sử dụng tempnam() để tạo ra một tên tập tin duy nhất:

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

Phần mở rộng của tập tin mới của bạn sẽ được thực hiện sau khi di chuyển các tập tin tải lên, ví dụ:

// 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

các tệp .tmp đang tạo của nó – user3726268

+0

@ user3726268 Bạn có thể thực hiện đổi tên sau đó để thay đổi phần mở rộng (hoặc loại bỏ nó hoàn toàn). –

+0

@ user3726268 Btw, làm 'tempnam()' là cách tiếp cận duy nhất đảm bảo tên tệp mới sẽ là duy nhất (thay vì chỉ ngẫu nhiên). –

Các vấn đề liên quan