2011-12-19 35 views
7

Tôi đã gửi biểu mẫu thảo luận với tải lên hình ảnh trong trang web của mình. Bây giờ, tôi muốn tải lên tên tệp duy nhất khi người dùng gửi hình ảnh của họ để tôi có thể hiển thị kết quả của tất cả hình ảnh và có thể tránh trùng lặp tên tệp. Làm thế nào có thể làm điều này với php? Nếu bạn cần mã quá trình biểu mẫu của tôi thì tôi sẽ tải nó lên.php Tên tệp duy nhất khi tải lên

Rất cám ơn.

+1

http://stackoverflow.com/questions/8551763/storing-image-data-in-mysql-and-naming-conventions/8551813#8551813 – Richard

+1

Sử dụng 'uniqid()' đặt tên tệp vĩnh viễn bằng 'move_uploaded_file() ' –

Trả lời

10

Bạn có thể sử dụng uniqid() chức năng để tạo ra một ID duy nhất

/** 
* Generate a unique ID 
* @link http://www.php.net/manual/en/function.uniqid.php 
* @param prefix string[optional] <p> 
* Can be useful, for instance, if you generate identifiers 
* simultaneously on several hosts that might happen to generate the 
* identifier at the same microsecond. 
* </p> 
* <p> 
* With an empty prefix, the returned string will 
* be 13 characters long. If more_entropy is 
* true, it will be 23 characters. 
* </p> 
* @param more_entropy bool[optional] <p> 
* If set to true, uniqid will add additional 
* entropy (using the combined linear congruential generator) at the end 
* of the return value, which should make the results more unique. 
* </p> 
* @return string the unique identifier, as a string. 
*/ 
function uniqid ($prefix = null, $more_entropy = null) {} 
8

Bạn có thể sử dụng dấu thời gian trong ngày, theo cách đó bạn sẽ không nhận được cùng tên tệp/thời gian hai lần.

Không nhất định chính xác những gì mã của bạn trông giống như nhưng bạn có thể làm điều gì đó như thế này:

$filename = uniqid() . $orig_filename; 

Read this documentation on the PHP docs about uniqid for more information. Nó sử dụng datetime để xuất ra một chuỗi định danh duy nhất.

+0

xin lỗi, bạn có thể xin vui lòng cho tôi một số ví dụ –

+0

Vâng, nó thay đổi tên với id duy nhất cho cơ sở dữ liệu, một cái gì đó như thế: 4eef63add36881162_03.JPG.Nhưng trong thư mục hình ảnh nó hiển thị tên hình ảnh gốc, Giống như: 1162_03.jpg, tôi có thể thay đổi tên hình ảnh gốc thành chính xác tên hình ảnh cơ sở dữ liệu không? –

+0

Tôi đã khắc phục sự cố này. Cảm ơn thời gian của bạn Batkins. –

0

Tôi nghĩ cách đơn giản nhất là lưu tên hình ảnh vào trường cơ sở dữ liệu và sau đó khi người dùng tải lên hình ảnh của họ để xác thực rằng tên tệp là duy nhất bằng cách kiểm tra tên tệp đó. Bạn có thể sử dụng giao diện ajax/jquery nếu bạn không muốn người dùng phải đợi đến khi biểu mẫu đã được gửi để nhận lỗi hoặc nhắc thay đổi tên tệp của họ.

+0

tốt, nhưng tôi nghĩ là có cách nào tốt hơn ... –

+0

Bạn có ý nghĩa gì một cách tốt hơn? Tôi nghĩ rằng hoặc bằng cách sử dụng một unique_id như đề xuất trong các ý kiến ​​khác hoặc có tên người dùng tập tin của họ là 2 cách tốt nhất? Nếu bạn lập kế hoạch hiển thị tên cho khách hàng thì cách tốt hơn là cho phép người dùng đặt tên tệp của họ bằng tên thân thiện với người dùng nếu không bạn sẽ hiển thị unique_id cho khách hàng có thể không phù hợp. – Robert

3

Nếu bạn cần một cái tên duy nhất, bạn có thể sử dụng uniqid.

$filename = uniqid() . '.jpeg'; 

Được cảnh báo mặc dù nó sẽ chỉ là duy nhất trên một máy, tức là nó có thể tạo ra cùng một điều nếu bạn chạy cùng một lúc trên hai máy khác nhau.

+0

+1 cho 'Được cảnh báo mặc dù nó sẽ chỉ là duy nhất trên một máy, tức là nó có thể tạo ra cùng một điều nếu bạn chạy nó cùng một lúc trên hai máy khác nhau.' –

1

Tùy chọn tốt nhất IMO sẽ là sử dụng sha1_file Nó sẽ tạo một băm duy nhất dựa trên nội dung tệp. Điều này sẽ chỉ va chạm nếu cùng một hình ảnh của nó hoặc một va chạm băm mà là 1 trong 2^160 cơ hội. Bạn có thể tránh có hình ảnh trùng lặp theo cách này tuy nhiên vì bạn đang tạo một băm từ tệp nó có thể chậm hơn.

$filename = sha1_file($upload_file) . $ext; 


lựa chọn khác là tempnam Nó sẽ tạo ra một tập tin tạm thời với một tên duy nhất.

Lưu ý: Nếu PHP không thể tạo một tập tin trong tham số dir chỉ định, nó rơi trở lại trên mặc định của hệ thống.

dụ cơ bản:

$filename = tempnam($dir, $prefix); 
unlink($filename)//we don't need the tempfile just the name 

Cũng lưu ý: Nếu bạn thay đổi tên tập tin nó có thể không là duy nhất.

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