Các lệnh 'file --mime-type' và 'mimetype' Trả về các kết quả khác nhau


9

Xin chào Tôi đang cố gắng tìm ra lý do tại sao PHP trả về loại tệp 'msword' khi nó phải là 'excel' vì vậy đã thử nghiệm trên hộp Ubuntu của tôi bằng cả hai lệnh 'tệp' và 'mimetype'. Như bạn có thể thấy từ các kết quả dưới đây, họ trả về các kết quả khác nhau. Ai có thể giải thích tại sao?

root@dev:~# file --mime-type 1.xls
1.xls: application/msword
root@dev:~# mimetype 1.xls
1.xls: application/vnd.ms-excel

Tôi cũng nên lưu ý rằng tệp đang đề cập đang trả về 'msword' trên Windows Server. Nó được tạo bằng PHPExcel.

Cảm ơn bạn đã giúp đỡ.

Câu trả lời:


7

filenhận được kết quả của nó từ /etc/mime.types.

Từ đó:

ứng dụng / toán học cũ
ứng dụng / ms-tnef
ứng dụng / msaccess mdb
ứng dụng / msword doc dot
ứng dụng / tin tức-tin nhắn-id
ứng dụng / truyền tin
ứng dụng / ocsp-request
ứng dụng / phản hồi ocsp

mimetype lấy nó từ ...

ENVIRONMENT

   XDG_DATA_HOME
   XDG_DATA_DIRS
       These variables can list base directories to search for data files.
       The shared mime-info will be expected in the "mime" sub directory
       of one of these directories. If these are not set, there will be
       searched for the following directories:

               $HOME/.local/share/mime
               /usr/local/share/mime
               /usr/share/mime

       See also the "XDG Base Directory Specification"
       http://freedesktop.org/Standards/basedir-spec
       <http://freedesktop.org/Standards/basedir-spec>

Đáng chú ý là phần này trong trang man cho mimetype:

Để đặt tên cho thiết bị chuyển mạch, tôi đã theo dõi trang chủ của tệp (1) phiên bản 4.02 khi có thể. Chúng dường như khác hoàn toàn với thông số kỹ thuật trong chương 'tiện ích' của IEEE Std 1003.1-2001 (POSIX).

Vì vậy, bạn có thể gọi nó là một lỗi đối với tập tin /etc/mime.typesvnd.ms-excelchính xác hơn.


Có vẻ như tôi bị mắc kẹt với vấn đề này trên cả Windows và Linux. Cảm ơn đã giải thích.
scampbell

vâng và nghĩ về nó ... mimetype có lẽ chỉ là máy tính để bàn nên khi giao dịch với máy chủ bạn sẽ sử dụng tệp.
Rinzwind

Tôi vào ngày 12.04 và nó xuất hiện chỉnh sửa /etc/mime.typeskhông ảnh hưởng đến kết quả file.
congusbongus

5

Có một sự khác biệt tương tự giữa hai công cụ cho .debcác gói.

Dường như tập tin sử dụng /etc/mime.typesmimetypesử dụng rất nhiều thứ phức tạp XDG_DATA_DIRS(từ man mimetypes):

ENVIRONMENT
       XDG_DATA_HOME
       XDG_DATA_DIRS
           These variables can list base directories to search for data files. The shared mime-info will be expected in the "mime" sub directory of one of these directories. If these are not set,
           there will be searched for the following directories:

                   $HOME/.local/share/mime
                   /usr/local/share/mime
                   /usr/share/mime

           See also the "XDG Base Directory Specification" http://freedesktop.org/Standards/basedir-spec <http://freedesktop.org/Standards/basedir-spec>

FILES
       The base dir for all data files is determined by two environment variables, see "ENVIRONMENT".

       BASE/mime/packages/SOURCE.xml
           All other files are compiled from these source files. To re-compile them use update-mime-database(1).

       BASE/mime/globs
           Compiled information about globs.

       BASE/mime/magic
           Compiled information about magic numbers.

       BASE/mime/MEDIA/SUBTYPE.xml
           Descriptions of a mimetype in multiple languages, used for the "--describe" switch.

Có vẻ như tôi bị mắc kẹt với vấn đề này trên cả Windows và Linux. Cảm ơn đã giải thích. Xin lỗi tôi không thể đánh dấu 2 là anwser. Cả hai đều được chú ý.
scampbell

1

Phải mất một thời gian để tìm thấy nó, nhưng tôi đã có thể cài đặt mimetype trên debian.

sudo apt-get install libfile-mimeinfo-perl

Bây giờ tôi nhận được application/vnd.ms-excelmột .xls thay vì application/msword.


0

Bạn đã đề cập đến việc bạn đang làm điều đó trong PHP. Tôi đã gặp phải sự khác biệt như vậy khi nhận được loại tập tin mime. Họ làm khác nhau. Để làm điều đó đúng trong PHP, bạn nên sử dụng finfo

$finfo = new finfo();
$mime = $finfo->file($path_to_file, FILEINFO_MIME);

Cảm ơn tôi đã sử dụng chức năng này. Nó trả về định dạng không chính xác. Đây là lý do tại sao tôi đã thử nghiệm.
scampbell

nó trở lại định dạng nào?
sẽ

Xem câu hỏi ban đầu
scampbell

Bạn đã không đề cập ở đó bạn đã sử dụng finfo. Nó có trả lại msword không?
LLT
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.