2010-09-19 33 views
5

Tôi đang cố gắng phát hiện loại tệp của thư viện tệp trên máy chủ web của chúng tôi vì chúng tôi đang triển khai mã được thiết kế để phát trực tuyến tệp đến trình duyệt một cách an toàn. Trước đây, các tập tin đã được lưu trữ và trình bày cho người dùng thông qua một href trực tiếp.Phát hiện một tập tin mimetype trong coldfusion đã được tải lên trên máy chủ

tôi đã cố gắng để làm điều này 3 cách khác nhau, tất cả trên máy tính địa phương của tôi (mà không phải là một môi trường sản xuất mô phỏng):

  1. Thiết lập một biến là giá trị của những gì được trả về từ hàm getPageContext(). getServletContext(). getMimeType(). Điều này phát hiện một số nhưng không phải tất cả các loại mime cho các tập tin.

  2. Tạo đối tượng từ coldfusion.util.MimeTypeUtils và hàm gọi hàm guessMimeType(). Điều này cũng phát hiện một số nhưng không phải tất cả các loại mime cho các tập tin.

  3. Hành động cffile = "đọc" trên tệp trong thư viện. Đây là giải pháp mà sếp của tôi đề nghị, vì anh ta đã sử dụng nó trên các tệp có hành động cffile = "upload" từ một biểu mẫu (và nói nó hoạt động), nhưng khi tôi sử dụng nó, cấu trúc cffile luôn trống.

Lý tưởng nhất, tôi muốn truy xuất loại mime của mỗi tệp nằm trên máy chủ với độ chính xác 100%. Mã tôi đã viết đã phát hiện khoảng 99% các tệp trên bản sao của repo của tôi, để lại khoảng 30 mà nó không thể nhận dạng được. Bao gồm trong đây là những tập tin MS văn phòng với phần mở rộng -x mới, và các tập tin nén tgz.

Tôi tự hỏi liệu có cách nào chắc chắn để phát hiện loại mime của bất kỳ tệp nào đã tồn tại trên máy chủ hay không bằng cách sử dụng mã CF để xem mã đó và mã sẽ được sử dụng sản xuất máy chủ, nơi rất ít ứng dụng được cài đặt? Đó là sự hiểu biết của tôi rằng hàm đầu tiên tôi tham chiếu sử dụng thư viện kiểu mime của hệ điều hành, và hàm thứ hai sử dụng một danh sách định sẵn trong đối tượng java cho các kiểu mime. Tìm kiếm trên Google và SO đã không tạo ra bất cứ điều gì cho tôi biết rằng CF có thể phát hiện chính xác các loại tệp mime trên chính nó, cũng như tôi không thấy bất kỳ điều gì nói rằng điều này không thể thực hiện được.

Chỉnh sửa: Đây là môi trường CF8.

+1

IIRC, loại mime trên tải lên cffile là loại mime được báo cáo bởi trình duyệt của khách hàng, có thể có hoặc không chính xác. Nó luôn luôn tồn tại, bởi vì trình duyệt được yêu cầu gửi * một cái gì đó * ngay cả khi nó chủ yếu là một trình giữ chỗ. –

+0

@Ben, Đó cũng là những gì tôi nghĩ. Tìm kiếm trên Google tiết lộ kết quả phù hợp với giải thích đó. Nếu tôi có thể tìm ra câu trả lời ở đây, tôi có thể đặt cùng một chức năng để kiểm tra phần phụ trợ của các tệp tải lên để chúng tôi không phải quay lại và xóa dữ liệu sau này cho các loại mime không phù hợp hoặc không chính xác từ các tệp được tải lên từ người dùng. –

Trả lời

2

Sẽ không có cách đảm bảo chắc chắn 100% vì loại mime là ánh xạ tùy ý.

Bạn sẽ cần phải sử dụng ánh xạ của ai đó, cho dù đó là hệ điều hành hoặc JVM.

Bạn có trách nhiệm điền vào bất kỳ khoảng trống nào mà OS hoặc JVM có trong ánh xạ và giữ cho đến thời điểm đó.

Nhưng, tôi sẽ luôn có thể tạo một số tệp, cung cấp cho nó phần mở rộng của .xyzzy và bạn sẽ không thể tìm ra 'loại mime' của nó.

+0

Điều này chỉ có vẻ một nửa. Tôi nghi ngờ rằng các loại mime không được lưu trữ trong các tệp, nhưng việc gán tùy ý cũng không đúng.Chắc chắn, bạn có thể tạo phần mở rộng tệp ngẫu nhiên của riêng mình, nhưng nếu bạn muốn sử dụng theo chương trình, bạn phải có cách để liên kết loại tệp với ứng dụng của mình ngoài việc thiết lập tiện ích mở rộng và loại mime trong db kiểu mime của hệ điều hành của bạn /danh sách. –

+1

Có lẽ 'tùy ý' là từ sai. Ý tôi là nó không phải là lập trình. Bạn không thể xem một tệp mà bạn chưa từng thấy trước đây và xác định loại mime thích hợp. Việc đăng ký kinh điển các loại mime có tại đây: http://www.iana.org/assignments/media-types/. Phương pháp xác định loại mime thường bằng cách tìm kiếm phần mở rộng của tệp hoặc số ma thuật (http://en.wikipedia.org/wiki/Magic_number_(programming)#Magic_numbers_in_files) dựa vào cơ sở dữ liệu các loại đã đăng ký. –

+0

Ok, tôi hiểu ngay bây giờ. Thấy siêu dữ liệu bên ngoài như thế nào, tôi thấy làm thế nào nó không thể có được tất cả thời gian. Tôi có thể xử lý bằng cách nhập thủ công một số loại mime và tôi có thể thực hiện xác nhận để chỉ chấp nhận các loại mime hiện có thể phát hiện hoặc trong trường hợp các tệp MS Office không xác định, chỉ cần gán mimetype chính xác theo chương trình nếu trình duyệt không thể . Cảm ơn đã giúp đỡ. –

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