Spring 之MultipartFile转换File 并鉴别File Mine Type 类型分析

java哥 阅读:165 2021-03-31 12:22:24 评论:0

常见 MIME 类型列表

扩展名 文档类型 MIME 类型
.aac AAC audio audio/aac
.abw AbiWord document application/x-abiword
.arc Archive document (multiple files embedded) application/x-freearc
.avi AVI: Audio Video Interleave video/x-msvideo
.azw Amazon Kindle eBook format application/vnd.amazon.ebook
.bin Any kind of binary data application/octet-stream
.bmp Windows OS/2 Bitmap Graphics image/bmp
.bz BZip archive application/x-bzip
.bz2 BZip2 archive application/x-bzip2
.csh C-Shell script application/x-csh
.css Cascading Style Sheets (CSS) text/css
.csv Comma-separated values (CSV) text/csv
.doc Microsoft Word application/msword
.docx Microsoft Word (OpenXML) application/vnd.openxmlformats-officedocument.wordprocessingml.document
.eot MS Embedded OpenType fonts application/vnd.ms-fontobject
.epub Electronic publication (EPUB) application/epub+zip
.gif Graphics Interchange Format (GIF) image/gif
.htm
.html
HyperText Markup Language (HTML) text/html
.ico Icon format image/vnd.microsoft.icon
.ics iCalendar format text/calendar
.jar Java Archive (JAR) application/java-archive
.jpeg
.jpg
JPEG images image/jpeg
.js JavaScript text/javascript
.json JSON format application/json
.jsonld JSON-LD format application/ld+json
.mid
.midi
Musical Instrument Digital Interface (MIDI) audio/midi audio/x-midi
.mjs JavaScript module text/javascript
.mp3 MP3 audio audio/mpeg
.mpeg MPEG Video video/mpeg
.mpkg Apple Installer Package application/vnd.apple.installer+xml
.odp OpenDocument presentation document application/vnd.oasis.opendocument.presentation
.ods OpenDocument spreadsheet document application/vnd.oasis.opendocument.spreadsheet
.odt OpenDocument text document application/vnd.oasis.opendocument.text
.oga OGG audio audio/ogg
.ogv OGG video video/ogg
.ogx OGG application/ogg
.otf OpenType font font/otf
.png Portable Network Graphics image/png
.pdf Adobe Portable Document Format (PDF) application/pdf
.ppt Microsoft PowerPoint application/vnd.ms-powerpoint
.pptx Microsoft PowerPoint (OpenXML) application/vnd.openxmlformats-officedocument.presentationml.presentation
.rar RAR archive application/x-rar-compressed
.rtf Rich Text Format (RTF) application/rtf
.sh Bourne shell script application/x-sh
.svg Scalable Vector Graphics (SVG) image/svg+xml
.swf Small web format (SWF) or Adobe Flash document application/x-shockwave-flash
.tar Tape Archive (TAR) application/x-tar
.tif
.tiff
Tagged Image File Format (TIFF) image/tiff
.ttf TrueType Font font/ttf
.txt Text, (generally ASCII or ISO 8859-n) text/plain
.vsd Microsoft Visio application/vnd.visio
.wav Waveform Audio Format audio/wav
.weba WEBM audio audio/webm
.webm WEBM video video/webm
.webp WEBP image image/webp
.woff Web Open Font Format (WOFF) font/woff
.woff2 Web Open Font Format (WOFF) font/woff2
.xhtml XHTML application/xhtml+xml
.xls Microsoft Excel application/vnd.ms-excel
.xlsx Microsoft Excel (OpenXML) application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
.xml XML application/xml 代码对普通用户来说不可读 (RFC 3023, section 3)
text/xml 代码对普通用户来说可读 (RFC 3023, section 3)
.xul XUL application/vnd.mozilla.xul+xml
.zip ZIP archive application/zip
.3gp 3GPP audio/video container video/3gpp
audio/3gpp(若不含视频)
.3g2 3GPP2 audio/video container video/3gpp2
audio/3gpp2(若不含视频)
.7z 7-zip archive application/x-7z-compressed

检查文件类型,先为pom.xml 添加第三方依赖:jmimemagic 类包

    <dependency> 
			<groupId>net.sf.jmimemagic</groupId> 
			<artifactId>jmimemagic</artifactId> 
			<version>0.1.5</version> 
		</dependency>

Spring 之MultipartFile转换File 并鉴别File Mine Type 类型 核心功能代码:

public boolean checkFileType(MultipartFile uploadFile){ 
		 //文件名 
        String fileName = uploadFile.getOriginalFilename(); 
        // 获取文件后缀 
        String suffix=fileName.substring(fileName.lastIndexOf(".")); 
        File picFile = null; 
        try { 
            // 用uuid作为文件名,防止生成的临时文件重复 
            picFile = File.createTempFile(String.valueOf(idGenerator.nextId()), suffix); 
            FileUtils.copyInputStreamToFile(uploadFile.getInputStream(),picFile); 
            // MultipartFile to File 
            MagicMatch match = Magic.getMagicMatch(picFile, false); 
            String mimeType = match.getMimeType(); 
            // 白名单匹配 
            boolean anyMatch = Arrays.stream(mimeTypeWhiteList).anyMatch(x -> x.equalsIgnoreCase(mimeType)); 
            return anyMatch; 
  
        } catch (IOException e) { 
            System.out.println("生成临时文件异常"); 
            logger.error("error: {}", e.getMessage(), e); 
        } catch (Exception e) { 
        	System.out.println("MIME-TYPE检查发生异常"); 
        	logger.error("error: {}", e.getMessage(), e); 
        } finally { 
            //程序结束时,删除临时文件 
            if (picFile.exists()){ 
                picFile.delete(); 
            } 
        } 
 
		return false; 
	}

改业务功能代码应用于文件上传功能:

/** 
	 * 通用文件上传功能; 备注:文件大小<=30M,如果超出规定文件大小,建议采用大文件上传 
	 *  
	 * @param entity 
	 * @return 
	 */ 
	@RequestMapping(value = "/fileUpload", method = { RequestMethod.POST }) 
	@ResponseBody 
	@ApiOperation(httpMethod = "POST", value = "文件上传(小于等于30M)") 
	public Result upload(ChunkInfoModel entity) { 
		if (logger.isDebugEnabled()) { 
			logger.debug(entity.toString()); 
		} 
		 
		boolean target = checkFileType(entity.getFile()); 
		if(!target){ 
			return Result.error("上传电子包文件格式不支持,本项目仅支持zip格式"); 
		} 
		 
		SysEfileInfo model = null; 
		try { 
			String folder = null; 
			if(StringUtils.isEmpty(entity.getFolder())){ 
				folder = "default"; 
			} else { 
				folder = entity.getFolder(); 
			} 
			model = upload.smallAttachUpload(entity, folder); 
		} catch (Exception e) { 
			// TODO Auto-generated catch block 
			 logger.error("error: {}", e.getMessage(), e); 
		} 
		return Result.ok("文件上传成功").setDatas("model", model); 
	} 

 

声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

发表评论
搜索
排行榜
关注我们

一个IT知识分享的公众号