Пожалуйста, помогите мне узнать тип загружаемого файла. Я хотел различать тип excel и csv.
MIMEType возвращает то же самое для обоих этих файлов. Пожалуйста, помогите.
Пожалуйста, помогите мне узнать тип загружаемого файла. Я хотел различать тип excel и csv.
MIMEType возвращает то же самое для обоих этих файлов. Пожалуйста, помогите.
Я использую Apache Tika, который идентифицирует тип файла с использованием шаблонов магического байта и подсказок globbing (расширение файла) для обнаружения типа MIME. Он также поддерживает дополнительный анализ содержимого файла (который я действительно не использую).
Вот быстрый и грязный пример того, как Tika можно использовать для определения типа файла без выполнения какого-либо дополнительного анализа в файле:
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.HashMap;
import org.apache.tika.metadata.HttpHeaders;
import org.apache.tika.metadata.Metadata;
import org.apache.tika.metadata.TikaMetadataKeys;
import org.apache.tika.mime.MediaType;
import org.apache.tika.parser.AutoDetectParser;
import org.apache.tika.parser.ParseContext;
import org.apache.tika.parser.Parser;
import org.xml.sax.helpers.DefaultHandler;
public class Detector {
public static void main(String[] args) throws Exception {
File file = new File("/pats/to/file.xls");
AutoDetectParser parser = new AutoDetectParser();
parser.setParsers(new HashMap<MediaType, Parser>());
Metadata metadata = new Metadata();
metadata.add(TikaMetadataKeys.RESOURCE_NAME_KEY, file.getName());
InputStream stream = new FileInputStream(file);
parser.parse(stream, new DefaultHandler(), metadata, new ParseContext());
stream.close();
String mimeType = metadata.get(HttpHeaders.CONTENT_TYPE);
System.out.println(mimeType);
}
}
Надеюсь, это поможет. Взято из примера не из моего:
import javax.activation.MimetypesFileTypeMap;
import java.io.File;
class GetMimeType {
public static void main(String args[]) {
File f = new File("test.gif");
System.out.println("Mime Type of " + f.getName() + " is " +
new MimetypesFileTypeMap().getContentType(f));
// expected output :
// "Mime Type of test.gif is image/gif"
}
}
То же самое может быть верно для типов excel и csv. Не тестировалось.
Я выяснил более дешевый способ сделать это с помощью java.nio.file.Files
public String getContentType(File file) throws IOException {
return Files.probeContentType(file.toPath());
}
- или -
public String getContentType(Path filePath) throws IOException {
return Files.probeContentType(filePath);
}
Надеюсь, что это поможет.
Приветствия.
A лучший способ без использования javax.activation.*
:
URLConnection.guessContentTypeFromName(f.getAbsolutePath()));
Если вы уже используете Spring, это работает для csv и excel:
import org.springframework.mail.javamail.ConfigurableMimeFileTypeMap;
import javax.activation.FileTypeMap;
import java.io.IOException;
public class ContentTypeResolver {
private FileTypeMap fileTypeMap;
public ContentTypeResolver() {
fileTypeMap = new ConfigurableMimeFileTypeMap();
}
public String getContentType(String fileName) throws IOException {
if (fileName == null) {
return null;
}
return fileTypeMap.getContentType(fileName.toLowerCase());
}
}
или с помощью javax.activation вы можете обновить файл mime.types.
CSV начнет с текста, а тип excel, скорее всего, будет двоичным.
Однако самый простой подход - попытаться загрузить документ excel с помощью POI. Если это не удается, попробуйте загрузить файл как CSV, если это не сработает, возможно, ни один из них.