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

常见 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);
	}

猜你喜欢

转载自blog.csdn.net/zhouzhiwengang/article/details/115160563