2009-01-08 10 views
8

Tôi muốn lấy loại MIME từ tên tệp bằng C. Có cách nào để làm điều này mà không sử dụng một tệp văn bản chứa các loại MIME và phần mở rộng tệp (tức là tệp của Apache mime.types)?Lấy loại MIME từ tên tệp trong C

Có thể có chức năng nhận loại MIME bằng tên tệp? Tôi không muốn sử dụng phần mở rộng tập tin nếu tôi không phải.

Trả lời

5

Nếu có cách nào để thực hiện điều đó, Apache sẽ không cần tệp mime.types của nó!

Bảng phải ở đâu đó. Nó nằm trong một tệp riêng biệt được phân tích bởi mã của bạn hoặc mã được mã hóa cứng vào phần mềm của bạn. Trước hết là giải pháp tốt hơn ...

Cũng có thể đoán loại MIME của tệp bằng cách kiểm tra nội dung của tệp, tức là trường tiêu đề, cấu trúc dữ liệu, v.v. Đây là phương pháp được sử dụng bởi file(1) chương trình và cũng bởi Apache mod_mime_magic. Trong cả hai trường hợp, họ vẫn sử dụng một tệp văn bản riêng biệt để lưu trữ các quy tắc tìm kiếm thay vì có bất kỳ chi tiết nào được mã hóa cứng trong chính chương trình đó.

+0

Quá tệ. Nhưng không phải Apache có thể tìm ra mimetype mà không kiểm tra phần mở rộng của tập tin không? Tôi biết một số người bạn của tôi, những người nhập http: //domain.tld/picture và Apache của họ trả về JPG. Có phải vì mimetype có trong JPG không? Cảm ơn bạn đã trả lời nhanh! – petsson

+3

tiện ích Unix "file" làm cho (rất) đoán tốt ở các loại tệp bằng cách kiểm tra tiêu đề, cấu trúc dữ liệu, v.v. Nhưng nó sử dụng một tệp riêng biệt (thường là/usr/share/file/magic) để lưu trữ tra cứu tra cứu! Mod_mime_magic của Apache hoạt động theo cùng một cách. – Alnitak

+0

Được rồi, vậy tôi biết. Cảm ơn một lần nữa! – petsson

6

như xa như tôi biết, lệnh unix file kết quả đầu ra chuỗi kịch câm với các tùy chọn -i:

> file -i main.c 
main.c: text/x-c charset=us-ascii 
+0

Làm thế nào có thể được sử dụng bằng cách sử dụng C? –

+0

hoặc bằng cách chỉ gọi nó là 'hệ thống (" tập tin -i "pszFilename)' hoặc tìm trong mã của 'tệp', xây dựng lại các phần cần thiết để phân tích cú pháp'/usr/share/file/magic' – lImbus

+0

Tốt, tôi sẽ thử điều này ngay sau khi tôi có thể tiếp cận máy chủ UNIX của tôi một lần nữa. :) – petsson

0

Bạn có thể tải mã nguồn của các "tập tin" công cụ từ đây:

ftp://ftp.astron.com/pub/file/

Điều đó là không ' t sử dụng giấy phép GPL, hoặc bất kỳ vấn đề nào cho vấn đề đó.

0

Nếu bạn muốn sử dụng một webservice, tôi vừa tạo này như một phần của Mimetype tôi < -> biểu tượng dịch vụ

http://stdicon.com/

Ví dụ:

http://stdicon.com/ext/html

Nó chạy trên appengine nên nó sẽ có tính sẵn sàng cao.

8

Tôi vừa triển khai điều này cho một dự án mà tôi đang làm việc. libmagic là những gì bạn đang tìm kiếm. Trên RHEL/CentOS của nó được cung cấp bởi file-libs và file-devel. Debian/Ubuntu dường như là libmagic-dev.

http://darwinsys.com/file/

Dưới đây là một số mã ví dụ:

#include <stdio.h> 
#include <magic.h> 

int main(int argc, char **argv){ 
    const char *mime; 
    magic_t magic; 

    printf("Getting magic from %s\n", argv[1]); 

    magic = magic_open(MAGIC_MIME_TYPE); 
    magic_load(magic, NULL); 
    magic_compile(magic, NULL); 
    mime = magic_file(magic, argv[1]); 

    printf("%s\n", mime); 
    magic_close(magic); 

    return 0; 
} 

Đoạn code dưới đây sử dụng mặc định ma thuật cơ sở dữ liệu/usr/share/misc/kỳ diệu. Khi bạn đã cài đặt các gói dev, trang man libmagic khá hữu ích. Tôi biết đây là một câu hỏi cũ, nhưng tôi tìm thấy nó trên săn của tôi cho câu trả lời tương tự. Đây là giải pháp ưa thích của tôi.