2012-03-24 18 views
9

Tôi cần đoán loại mime với mục đích điền tiêu đề "Loại nội dung" cho một số tệp tải lên.Bất kỳ cách nào để đoán loại mime trên Delphi XE2?

Tôi không tìm thấy giải pháp cho nó.

Tôi muốn gọi một cái gì đó như: GetMimeType('C:File.jpg') và quay lại image/jpg.

Tốt nhất nếu là multiplataform (cho win/osx) nhưng sẽ là đủ nếu chỉ cho các cửa sổ.

Trả lời

5

Internet trực tiếp (Indy) chứa một lớp học cho việc này:

lớp TIdThreadSafeMimeTable

trong đơn vị IdCustomHTTPServer

Mã ví dụ trong một ứng dụng HTTP server:

Response.ContentType := 
    Response.HTTPServer.MIMETable.GetFileMIMEType(FileName); 
5

Bạn đang nói về bao nhiêu loại tệp? Có thể bạn chỉ cần tạo danh sách các loại bạn muốn hỗ trợ.

tôi có thể tưởng tượng các danh sách này sẽ có sẵn trên internet là tốt, ví dụ

Chỉ nhận tiện ích mở rộng tệp bằng cách sử dụng ExtractFileExt và kiểm tra lại lần nữa một trong các danh sách đó. Tệp không có loại mime trong đó, vì vậy bạn sẽ cần phải sử dụng danh sách các phần mở rộng tệp này hoặc xác định loại bằng cách đọc tiêu đề tệp, điều này khó hơn và không đáng tin cậy.

9

Thử sử dụng chức năng FindMimeFromData.

FindMimeFromData chứa kiểm tra mã hóa cứng cho (hiện tại 26) riêng biệt loại MIME (xem Known MIME Types). Điều này có nghĩa rằng nếu một bộ đệm nhất định chứa dữ liệu theo định dạng của một trong các loại MIME này, thì kiểm tra tồn tại trong FindMimeFromData được thiết kế (bằng cách quét qua vùng đệm ) để nhận dạng loại MIME tương ứng.

từ urlmon.pas

function FindMimeFromData(
    pBC: IBindCtx;      // bind context - can be nil 
    pwzUrl: LPCWSTR;     // url - can be nil 
    pBuffer: Pointer;     // buffer with data to sniff - can be nil (pwzUrl must be valid) 
    cbSize: DWORD;      // size of buffer 
    pwzMimeProposed: LPCWSTR;   // proposed mime if - can be nil 
    dwMimeFlags: DWORD;     // will be defined 
    out ppwzMimeOut: LPWSTR;   // the suggested mime 
    dwReserved: DWORD     // must be 0 
): HResult; stdcall; 

Ngoài ra bài viết này để thấy nóng nó hoạt động MIME Type Detection in Internet Explorer

7

IE sử dụng GetClassFileOrMimeFindMimeFromData API để phát hiện các loại mime dữ liệu/file (UrlMon đơn vị trong Delphi).

MIME Type Detection in Internet Explorer

Các CLSID trở về từ GetClassFileOrMime thể được đặt trong registry dưới HKEY_CLASSES_ROOT\CLSID\<clsid>\MimeTypes. (cũng FileExtensions, FriendlyName).

Cơ quan đăng ký cũng có cơ sở dữ liệu MIME theo: HKEY_CLASSES_ROOT\MIME\Database\Content Type.

Nhưng kể từ danh sách known MIME types là tương đối nhỏ, bạn có thể giữ điều đó dưới dạng XML tài nguyên (hoặc bất kỳ thứ gì) và chỉ cần tìm nạp từ đó. Điều này sẽ hỗ trợ cả Windows và OSX.


Để thao tác tải lên tệp, bạn có thể chỉ cần sử dụng application/octet-stream.
Indy có TIdMimeTable lớp (IdGlobal) và nó sử dụng danh sách cố định cộng với kiểm tra sổ đăng ký HKEY_CLASSES_ROOT (xem FillMimeTable). Nếu không tìm thấy kết quả phù hợp, hãy sử dụng application/octet-stream.
Bạn có thể muốn kiểm tra tệp nội dung ở phía máy chủ khi tệp được tải lên và không dựa vào tiêu đề vì ContentType có thể bị giả mạo ở phía máy khách và cũng không khớp với đăng ký tại máy chủ -bên.

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