Để gắn chip với 5 xu của tôi:
TL, DR
Tôi sử dụng MimetypesFileTypeMap và thêm bất kỳ mime nào không có ở đó và tôi đặc biệt cần nó, vào tệp mime.types.
Và bây giờ, đọc dài:
Trước hết, danh sách các loại MIME rất lớn , xem tại đây: https://www.iana.org/assignments/media-types/media-types.xhtml
Tôi thích sử dụng các tiện ích tiêu chuẩn do JDK cung cấp trước tiên và nếu điều đó không hiệu quả, tôi sẽ đi tìm thứ khác.
Xác định loại tệp từ phần mở rộng tệp
Kể từ 1.6, Java có MimetypesFileTypeMap, như được chỉ ra trong một trong những câu trả lời ở trên và đó là cách đơn giản nhất để xác định loại mime:
new MimetypesFileTypeMap().getContentType( fileName );
Trong triển khai vanilla của nó, điều này không làm được gì nhiều (nghĩa là nó hoạt động với .html nhưng nó không cho .png). Tuy nhiên, rất đơn giản để thêm bất kỳ loại nội dung nào bạn có thể cần:
- Tạo tệp có tên 'mime.types' trong thư mục META-INF trong dự án của bạn
- Thêm một dòng cho mọi loại mime bạn cần và việc triển khai mặc định không cung cấp (có hàng trăm loại mime và danh sách tăng lên khi thời gian trôi qua).
Các mục ví dụ cho các tệp png và js sẽ là:
image/png png PNG
application/javascript js
Đối với định dạng tệp mime.types, xem thêm chi tiết tại đây: https://docs.oracle.com/javase/7/docs/api/javax/activation/MimetypesFileTypeMap.html
Xác định loại tệp từ nội dung tệp
Kể từ 1.7, Java có java.nio.file.spi.FileTypeDetector , định nghĩa API tiêu chuẩn để xác định loại tệp theo cách cụ thể thực hiện .
Để tìm nạp loại mime cho một tệp, bạn chỉ cần sử dụng Tệp và thực hiện điều này trong mã của mình:
Files.probeContentType(Paths.get("either file name or full path goes here"));
Định nghĩa API cung cấp cho các phương tiện hỗ trợ xác định loại mime tệp từ tên tệp hoặc từ nội dung tệp (byte ma thuật). Đó là lý do tại sao thăm dòContentType () phương thức ném IOException, trong trường hợp việc triển khai API này sử dụng Đường dẫn được cung cấp cho nó để thực sự cố gắng mở tệp được liên kết với nó.
Một lần nữa, vanilla thực hiện điều này (cái đi kèm với JDK) để lại rất nhiều mong muốn.
Trong một thế giới lý tưởng ở một thiên hà xa xôi, tất cả các thư viện cố gắng giải quyết vấn đề kiểu tệp này thành đơn giản sẽ thực hiện java.nio.file.spi.FileTypeDetector , bạn sẽ bỏ vào thư viện triển khai thư viện ưa thích gửi vào classpath của bạn và đó sẽ là nó.
Trong thế giới thực, nơi bạn cần phần TL, DR, bạn nên tìm thư viện có hầu hết các ngôi sao bên cạnh tên của nó và sử dụng nó. Đối với trường hợp cụ thể này, tôi không cần một (chưa;)).