質問
どうしてそうなっちゃうんですかどんな風に多くの人を取得するmimeタイプからファイルをJava?ここまでしutils: JMimeMagic
& Mime-Util
.
最初にしてくれたメモリの例外を除き、第二になり、その流オフます。どうしてそうなっちゃうんですかだいった方法/図書館を使いたかったはずです。
解決
Java7ができるだけ利用 Files.probeContentType(path)
.
他のヒント
残念ながら、
mimeType = file.toURL().openConnection().getContentType();
が働かないため、この利用URLの葉のファイルをロックでは、例えばですが初期値.
しかしながら、この:
mimeType= URLConnection.guessContentTypeFromName(file.getName());
ともに以下の、は、単なる使用のファイル拡張子から覗き込みたコンテンツ
InputStream is = new BufferedInputStream(new FileInputStream(file));
mimeType = URLConnection.guessContentTypeFromStream(is);
//...close stream
しかし、このように日本のコメントは、上記のテーブルのmimeタイプは非常に限定されないなどの項目を、PDFとしています。なので、したい場合に一般化する必要がありまを超える図書館の利用、例えば、Mime-Util(大図書館の利用の両方のファイル拡張子やコンテンツ).
のJAF APIの一部であるJDK6.見 javax.activation
パッケージです。
最も興味深い授業 javax.activation.MimeType
-実際のMIMEタイプのホルダーと javax.activation.MimetypesFileTypeMap
クラスがインスタンスを解決することができMIMEタイプ文字列としてファイル:
String fileName = "/path/to/file";
MimetypesFileTypeMap mimeTypesMap = new MimetypesFileTypeMap();
// only by file name
String mimeType = mimeTypesMap.getContentType(fileName);
// or by actual File instance
File file = new File(fileName);
mimeType = mimeTypesMap.getContentType(file);
と Apache Tika 必要なもののみ ディズニーランド(コード:
File file = new File("/path/to/file");
Tika tika = new Tika();
System.out.println(tika.detect(file));
またgroovyコンソール、ペーストとのコードに遊びないものとします。
@Grab('org.apache.tika:tika-core:1.14')
import org.apache.tika.Tika;
def tika = new Tika()
def file = new File("/path/to/file")
println tika.detect(file)
だがそのApiが豊富なので、解析")としてのtikaコア1.14す:
String detect(byte[] prefix)
String detect(byte[] prefix, String name)
String detect(File file)
String detect(InputStream stream)
String detect(InputStream stream, Metadata metadata)
String detect(InputStream stream, String name)
String detect(Path path)
String detect(String name)
String detect(URL url)
見 のapidocs ます。
Apache Tika ご提供 tikaコア mimeタイプ検出に基づくマジックマーカーのストリームに接頭辞です。 tika-core
な取得その他の依存関係のため、そして軽量化として現在、ピアツェンツァのドゥオーモ Mimeタイプの検出用.
簡単なコード例では(Java7を使うと、変数 theInputStream
や theFileName
try (InputStream is = theInputStream;
BufferedInputStream bis = new BufferedInputStream(is);) {
AutoDetectParser parser = new AutoDetectParser();
Detector detector = parser.getDetector();
Metadata md = new Metadata();
md.add(Metadata.RESOURCE_NAME_KEY, theFileName);
MediaType mediaType = detector.detect(bis, md);
return mediaType.toString();
}
ごMediaType.検出(...)は使用できません直接TIKA-1120).以上のヒントを提供してい https://tika.apache.org/0.10/detection.html.
だAndroid開発者をしてお使いいただけますユーティリティクラス android.webkit.MimeTypeMap
マップMIMEタイプをファイルの拡張子です。
次のコードスニペットがあります。
private static String getMimeType(String fileUrl) {
String extension = MimeTypeMap.getFileExtensionFromUrl(fileUrl);
return MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension);
}
から roseindia:
FileNameMap fileNameMap = URLConnection.getFileNameMap();
String mimeType = fileNameMap.getContentTypeFor("alert.gif");
場合にこだわっていjava5-6 このユーティリティクラスから 特定のオープンソース製品.
が必要となりますこの機能
public static String getContentType(byte[] data, String name)
このプローブのバイトのコンテンツを返しますコンテンツ種類に基づくコンテンツではなくファイル拡張子.
どうしてそうなっちゃうんですかどんな風に多くの人を取得するmimeタイプからファイルをJava?
私公開 SimpleMagic Javaパッケージでコンテンツタイプ(mimeタイプ)判定ファイルからバイト配列.での読みのUnixファイル(1)コマンドはマジックファイルの最~UnixをOSとが可能です。-
またApache Tikaで 巨大 トンの依存関係のため、 URLConnection
使用していませんのバイトのファイル MimetypesFileTypeMap
もう見てファイル名です。
とSimpleMagicいつものように:
// create a magic utility using the internal magic file
ContentInfoUtil util = new ContentInfoUtil();
// if you want to use a different config file(s), you can load them by hand:
// ContentInfoUtil util = new ContentInfoUtil("/etc/magic");
...
ContentInfo info = util.findMatch("/tmp/upload.tmp");
// or
ContentInfo info = util.findMatch(inputStream);
// or
ContentInfo info = util.findMatch(contentByteArray);
// null if no match
if (info != null) {
String mimeType = info.getMimeType();
}
チップをも5セント:
TL,DR
使ってい MimetypesFileTypeMap と追加mimeではない具体的には必要としているmime.種類ファイルです。
現在の読み:
まず、MIMEタイプ一覧 巨大, 情報はこちらをご確認ください: https://www.iana.org/assignments/media-types/media-types.xhtml
私のように利用施設によるJDK、そのエラーになっ探し、地下鉄からも近くて便利。
定ファイルタイプからファイル拡張子
以来、1.6、JavaはMimetypesFileTypeMap、一つの回答上で、最も簡単な方法の決定のmimeタイプ:
new MimetypesFileTypeMap().getContentType( fileName );
そのバニラの実装本なおみねおくがけみち)(できます。htmlにおいて接続されたことを示しています。png).しかし、ウェブサービス追加コンテンツタイプする必要がある:
- の作成という名前のファイル'mime.種類"のMETA-INFフォルダをプロジェクト
- 追加ライン毎のmimeタイプを必要な時に必要なデフォルト実装していませんが(も数多くありますmimeタイプおよびリストが時間ととも必要です。
例集pngおよびjsファイルをすることはできない。
image/png png PNG
application/javascript js
のためのmime.種類のファイル形式の詳細はこちら: https://docs.oracle.com/javase/7/docs/api/javax/activation/MimetypesFileTypeMap.html
定ファイル型のファイルからコンテンツ
以来、1.7、Javaは java.nio.ファイルです。spi.FileTypeDetector, を定義する標準APIを決定するファイルタイプ 実装固有の方法.
を取得するためにmimeタイプをファイルだけ利用 ファイル いこのコード:
Files.probeContentType(Paths.get("either file name or full path goes here"));
APIの定義を提供する施設について支援のいずれかを決定するファイルのmimeタイプからファイルのファイル名やファイルからコンテンツ(マジックバイト単位)。その probeContentType() 法throws IOException場合、実装がこのAPIの使用経路において、ご提供いただいたかによって、ファイルが関連付けられています。
再びガーデンプレイスの片隅、 実施 ここに付属しているJDK)の葉で多くを望まれるところである。
一部の理想世界の銀河からこれらすべてのライブラリーを解決しようこのファイルへのmimeタイプの問題はその実施 java.nio.ファイルです。spi.FileTypeDetector, というの優先実施図書館のjarファイルをclasspathとなるのです。
現実の世界では、一る必要がある場合TL、DRのセクションでは、何をすべき図書館のほとんど星ったの名前として使用します。この場合、必要のないワン(未;)).
また複数の方法で、最初のものとは言え@トミュージアムですよね。が認識されないの頻繁なmimetype様のためにPDFファイル、およびその他のできない信頼性と偽のファイル(たとRARファイルの拡張子を変更TIF).の溶液から、とも言われるよ@ジョシュア-フォックスは、表面的では使用 MimeUtil2, このよう:
MimeUtil2 mimeUtil = new MimeUtil2();
mimeUtil.registerMimeDetector("eu.medsea.mimeutil.detector.MagicMimeMimeDetector");
String mimeType = MimeUtil2.getMostSpecificMimeType(mimeUtil.getMimeTypes(file)).toString();
を用い二層の検証のためのファイルをアップロード。※
最初から確認することができますのmimeTypeとを検証します。
第二にしておくとよいでしょうに変換する最初の4バイトのファイルに進数とその比較では、魔法数です。それは本当に安全かつチェックのためのファイルの検証.
春 MultipartFile ファイル
org.springframework.ます。multipart.MultipartFile
file.getContentType();
この最も簡単な方法からその為には:
byte[] byteArray = ...
InputStream is = new BufferedInputStream(new ByteArrayInputStream(byteArray));
String mimeType = URLConnection.guessContentTypeFromStream(is);
え、この場合はlinux等のOSがコマンドライン file --mimetype
:
String mimetype(file){
//1. run cmd
Object cmd=Runtime.getRuntime().exec("file --mime-type "+file);
//2 get output of cmd , then
//3. parse mimetype
if(output){return output.split(":")[1].trim(); }
return "";
}
その
mimetype("/home/nyapp.war") // 'application/zip'
mimetype("/var/www/ggg/au.mp3") // 'audio/mp3'
るようにして、その他各図書館に着いたのはmime-util.
<groupId>eu.medsea.mimeutil</groupId>
<artifactId>mime-util</artifactId>
<version>2.1.3</version>
</dependency>
File file = new File("D:/test.tif");
MimeUtil.registerMimeDetector("eu.medsea.mimeutil.detector.MagicMimeMimeDetector");
Collection<?> mimeTypes = MimeUtil.getMimeTypes(file);
System.out.println(mimeTypes);
public String getFileContentType(String fileName) {
String fileType = "Undetermined";
final File file = new File(fileName);
try
{
fileType = Files.probeContentType(file.toPath());
}
catch (IOException ioException)
{
System.out.println(
"ERROR: Unable to determine file type for " + fileName
+ " due to exception " + ioException);
}
return fileType;
}
行うことができるので一線: MimetypesFileTypeMap().getContentType(新しいファイル("ファイル名を指定します。ext")).見てのテストコード(Java7):
import java.io.File;
import javax.activation.MimetypesFileTypeMap;
public class MimeTest {
public static void main(String a[]){
System.out.println(new MimetypesFileTypeMap().getContentType(
new File("/path/filename.txt")));
}
}
このコードを生産し続出力: text/plain
File file = new File(PropertiesReader.FILE_PATH);
MimetypesFileTypeMap fileTypeMap = new MimetypesFileTypeMap();
String mimeType = fileTypeMap.getContentType(file);
URLConnection uconnection = file.toURL().openConnection();
mimeType = uconnection.getContentType();