2011-07-07 26 views
9

Tôi có một tệp có tên là 94bf663a100e848fb599209af8cdc2b5.wmv. Tôi biết pathinfo sẽ không cung cấp cho tôi phần mở rộng nếu tôi chỉ sử dụng tên 94bf663a100e848fb599209af8cdc2b5. Tôi tin rằng glob chỉ dành cho việc kiểm tra xem tệp có tồn tại hay không. Vì vậy, nó có thể để có được một phần mở rộng tập tin chỉ biết tên tập tin (94bf663a100e848fb599209af8cdc2b5)?Có thể tải phần mở rộng tập tin mà không biết?

+0

hahahaha điều đó tốt. Tôi không thể tin rằng bạn đã có thể kéo ra tham chiếu đó quá nhanh. – Scarface

+0

Xin lưu ý rằng mọi tiện ích mở rộng đều là một phần của tên tệp: bạn có thể có các tệp có tên là 'foo',' foo.bar', 'foo.bar.tar',' foo.bar.tar.gz', 'foo.bar .tar.gz.sig' và tất cả đều đề cập đến các tệp khác nhau. (Tạm thời bỏ qua các tệp được liên kết nhiều.) Nếu bạn không biết bất kỳ phần mở rộng nào, bạn không thực sự _have_ tên tệp. Sự khác biệt này rất quan trọng, vì đó là lý do tại sao [Michael] (http://stackoverflow.com/questions/6615039) và các câu trả lời của Switz (nay đã bị xóa) không phù hợp với bạn. – sarnold

Trả lời

11

Như ví dụ trên php glob manual page thấy, glob không không chỉ cần kiểm tra nếu tập tin tồn tại, nó sẽ trả về tất cả các tập tin đó phù hợp với biểu hiện.

Dưới đây là một sửa đổi của ví dụ trên that page cho nhu cầu của bạn:

$name = "94bf663a100e848fb599209af8cdc2b5"; 
$matching = glob($name . ".*"); 

$info = pathinfo($matching[0]); 
$ext = $info['extension']; 

này giả định có một (và chỉ một) nộp với tên đó (với mở rộng bất kỳ), nhưng bạn sẽ có thể để sửa đổi nó nếu tệp có thể không tồn tại hoặc có thể có nhiều tệp có cùng tên và các phần mở rộng khác nhau.

+0

Nó hoạt động rocker. Chỉ là những gì tôi đang tìm kiếm khá nhiều. Mỗi tên tập tin là duy nhất vì vậy tôi nghĩ rằng glob sẽ là đủ. – Scarface

1

Chức năng finfo_file() sẽ kiểm tra chữ ký byte của tệp để trả về kiểu mẫu. Từ đó, bạn chủ yếu có thể suy ra phần mở rộng tập tin chính xác.

// Adapted from the PHP docs 
$finfo = finfo_open(FILEINFO_MIME_TYPE); // return mime type ala mimetype extension 
echo finfo_file($finfo, $filename); 
finfo_close($finfo); 
+0

Điều này giả định rằng phần mở rộng khớp với loại mime. Và không thành công cho các biến thể như '.jpeg' so với' .jpg'. Nó cũng đòi hỏi một số loại bảng tra cứu với phần mở rộng tập tin. –

+0

tệp tin không hoạt động nếu không có phần mở rộng. Tôi vừa thử nghiệm nó. $ filename =/file1/file2/94bf663a100e848fb599209af8cdc2b5 – Scarface

+1

fileinfo hoạt động bất kể phần mở rộng của tập tin có hoặc thậm chí nếu tập tin không có phần mở rộng. Đây thực sự là cách ưa thích để tìm/xác thực loại tệp. Trong khi tôi không biết tại sao bạn đang cố gắng để có được phần mở rộng, nếu nó là để xác nhận, bất cứ điều gì mà không sử dụng heuristics để xác nhận loại sẽ mở một lỗ hổng bảo mật cho hệ thống. – Mamsaac

0

Một vài ký tự đầu tiên của tệp (nhị phân) thường sẽ cung cấp cho bạn một số loại gợi ý về loại tệp là gì.

Hãy dùng thử bằng cách mở một số tệp nhị phân (rar, zip, mp3, v.v.) trong Notepad.

+0

Vâng, nhưng tôi đang cố gắng để có được phần mở rộng trong php một cách hiệu quả. – Scarface

0

Thử chức năng filetype() hoặc mime_content_type() trong php ... chuyển đường dẫn tệp sẽ trả về loại tệp.

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