页面上传bmp格式图片报错:net.sf.jmimemagic.MagicMatchNotFoundException

版权声明:本文为博主原创文章,转载请注明出处,尊重劳动成果,谢谢~ https://blog.csdn.net/zhanglf02/article/details/86686964

最近碰到这个问题,页面上传图片,gif,png,jpg,jpeg都能正常上传,但是bmp格式的就报错,查看后台日志确实是报错了,原因就是jmimemagic包找不到对应的类型。报了个类型不匹配的错误。我的解决办法总体来讲并没有正面解决这个问题。而是后台判断图片的格式,如果是bmp格式,就直接返回页面提示信息:不支持的图片格式类型

后台是dubbo服务,在消费端先是报错:java.io.IOException: Response data error, expect Throwable, but get {suppressedExceptions=[], cause=(this Map), stackTrace=[Ljava.lang.StackTraceElement;@22282b30, detailMessage=null},然后去提供方看代码日志,就报错如题目中所说:net.sf.jmimemagic.MagicMatchNotFoundException。具体异常如下:

1.dubbo消费方

上传图片出错
com.jd.service.rpc.RpcException: Failed to invoke the method uploadImg in the service com.jd.ecc.b2b.base.center.service.client.ImgService. Tried 3 times of the providers [10.112.12.100:20881] (1/1) from the registry 10.112.12.10:2181 on the consumer 10.112.12.119 using the dubbo version 2.4.10. Last error is: Failed to invoke remote method: uploadImg, provider: dubbo://10.112.12.100:20881/com.jd.ecc.b2b.base.center.service.client.ImgService?anyhost=true&application=mall&check=false&default.timeout=30000&dubbo=2.0.1***************省略dubbo的信息******************,
cause: java.io.IOException: Response data error, expect Throwable, but get {suppressedExceptions=[], cause=(this Map), stackTrace=[Ljava.lang.StackTraceElement;@22282b30, detailMessage=null}
java.io.IOException: Response data error, expect Throwable, but get {suppressedExceptions=[], cause=(this Map), stackTrace=[Ljava.lang.StackTraceElement;@22282b30, detailMessage=null}
        at com.jd.service.rpc.protocol.dubbo.DecodeableRpcResult.decode(DecodeableRpcResult.java:94)
        at com.jd.service.rpc.protocol.dubbo.DecodeableRpcResult.decode(DecodeableRpcResult.java:109)
        at com.jd.service.rpc.protocol.dubbo.DubboCodec.decodeBody(DubboCodec.java:97)
        at com.jd.service.remoting.exchange.codec.ExchangeCodec.decode(ExchangeCodec.java:128)
        at com.jd.service.remoting.exchange.codec.ExchangeCodec.decode(ExchangeCodec.java:87)
        at com.jd.service.rpc.protocol.dubbo.DubboCountCodec.decode(DubboCountCodec.java:49)
        at com.jd.service.remoting.transport.netty.NettyCodecAdapter$InternalDecoder.messageReceived(NettyCodecAdapter.java:135)
        at org.jboss.netty.channel.SimpleChannelUpstreamHandler.handleUpstream(SimpleChannelUpstreamHandler.java:70)
        at org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:564)
        at org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:559)
        at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:268)
        at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:255)
        at org.jboss.netty.channel.socket.nio.NioWorker.read(NioWorker.java:88)
        at org.jboss.netty.channel.socket.nio.AbstractNioWorker.process(AbstractNioWorker.java:109)
        at org.jboss.netty.channel.socket.nio.AbstractNioSelector.run(AbstractNioSelector.java:312)
        at org.jboss.netty.channel.socket.nio.AbstractNioWorker.run(AbstractNioWorker.java:90)
        at org.jboss.netty.channel.socket.nio.NioWorker.run(NioWorker.java:178)
        at org.jboss.netty.util.ThreadRenamingRunnable.run(ThreadRenamingRunnable.java:108)
        at org.jboss.netty.util.internal.DeadLockProofWorker$1.run(DeadLockProofWorker.java:42)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at java.lang.Thread.run(Thread.java:745)

        at com.jd.service.rpc.cluster.support.FailoverClusterInvoker.doInvoke(FailoverClusterInvoker.java:101)
        at com.jd.service.rpc.cluster.support.AbstractClusterInvoker.invoke(AbstractClusterInvoker.java:226)
        at com.jd.service.rpc.cluster.support.wrapper.MockClusterInvoker.invoke(MockClusterInvoker.java:72)
        at com.jd.service.rpc.proxy.InvokerInvocationHandler.invoke(InvokerInvocationHandler.java:52)
        at com.jd.service.common.bytecode.proxy75.uploadImg(proxy75.java)
        at com.jd.ecc.b2b.mall.web.register.AuthenticationController.uploadImage(AuthenticationController.java:550)
        at com.jd.ecc.b2b.mall.web.register.AuthenticationController.ajaxFileUpload(AuthenticationController.java:1388)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:497)
        at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:219)
        at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132)
        at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104)
        at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:745)
        at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:686)
        at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80)
        at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:925)
        at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856)
        at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:936)
        at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:838)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:648)
        at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:812)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:292)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
        at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:77)
        at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
        at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
        at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
        at com.jd.ecc.b2b.mall.web.filter.NoCacheFilter.doFilter(NoCacheFilter.java:28)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
        at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:212)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:94)
        at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:504)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
        at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:620)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:502)
        at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1132)
        at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:684)
        at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1533)
        at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1489)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
        at java.lang.Thread.run(Thread.java:745)
Caused by: com.jd.service.remoting.RemotingException: java.io.IOException: Response data error, expect Throwable, but get {suppressedExceptions=[], cause=(this Map), stackTrace=[Ljava.lang.StackTraceElement;@22282b30, detailMessage=null}
java.io.IOException: Response data error, expect Throwable, but get {suppressedExceptions=[], cause=(this Map), stackTrace=[Ljava.lang.StackTraceElement;@22282b30, detailMessage=null}
        at com.jd.service.rpc.protocol.dubbo.DecodeableRpcResult.decode(DecodeableRpcResult.java:94)
        at com.jd.service.rpc.protocol.dubbo.DecodeableRpcResult.decode(DecodeableRpcResult.java:109)
        at com.jd.service.rpc.protocol.dubbo.DubboCodec.decodeBody(DubboCodec.java:97)
        at com.jd.service.remoting.exchange.codec.ExchangeCodec.decode(ExchangeCodec.java:128)
        at com.jd.service.remoting.exchange.codec.ExchangeCodec.decode(ExchangeCodec.java:87)
        at com.jd.service.rpc.protocol.dubbo.DubboCountCodec.decode(DubboCountCodec.java:49)
        at com.jd.service.remoting.transport.netty.NettyCodecAdapter$InternalDecoder.messageReceived(NettyCodecAdapter.java:135)
        at org.jboss.netty.channel.SimpleChannelUpstreamHandler.handleUpstream(SimpleChannelUpstreamHandler.java:70)
        at org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:564)
        at org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:559)
        at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:268)
        at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:255)
        at org.jboss.netty.channel.socket.nio.NioWorker.read(NioWorker.java:88)
        at org.jboss.netty.channel.socket.nio.AbstractNioWorker.process(AbstractNioWorker.java:109)
        at org.jboss.netty.channel.socket.nio.AbstractNioSelector.run(AbstractNioSelector.java:312)
        at org.jboss.netty.channel.socket.nio.AbstractNioWorker.run(AbstractNioWorker.java:90)
        at org.jboss.netty.channel.socket.nio.NioWorker.run(NioWorker.java:178)
        at org.jboss.netty.util.ThreadRenamingRunnable.run(ThreadRenamingRunnable.java:108)
        at org.jboss.netty.util.internal.DeadLockProofWorker$1.run(DeadLockProofWorker.java:42)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at java.lang.Thread.run(Thread.java:745)

        at com.jd.service.remoting.exchange.support.DefaultFuture.returnFromResponse(DefaultFuture.java:190)
        at com.jd.service.remoting.exchange.support.DefaultFuture.get(DefaultFuture.java:110)
        at com.jd.service.remoting.exchange.support.DefaultFuture.get(DefaultFuture.java:84)
        at com.jd.service.rpc.protocol.dubbo.DubboInvoker.doInvoke(DubboInvoker.java:96)
        at com.jd.service.rpc.protocol.AbstractInvoker.invoke(AbstractInvoker.java:144)
        at com.jd.service.rpc.protocol.dubbo.filter.FutureFilter.invoke(FutureFilter.java:53)
        at com.jd.service.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:91)
        at com.jd.bk.saf.filter.UmpLoggerFilter.invoke(UmpLoggerFilter.java:76)
        at com.jd.service.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:91)
        at com.jd.bk.saf.filter.SafMonitorFilter.invoke(SafMonitorFilter.java:58)
        at com.jd.service.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:91)
        at com.jd.service.rpc.filter.ConsumerContextFilter.invoke(ConsumerContextFilter.java:48)
        at com.jd.service.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:91)
        at com.jd.service.rpc.listener.ListenerInvokerWrapper.invoke(ListenerInvokerWrapper.java:74)
        at com.jd.service.rpc.protocol.InvokerWrapper.invoke(InvokerWrapper.java:53)
        at com.jd.service.rpc.cluster.support.FailoverClusterInvoker.doInvoke(FailoverClusterInvoker.java:77)
        ... 55 more

2.服务提供方的错误信息

2019-Jan-28 16:48:06.068 - [2318129] - [ ERROR] - [DubboServerHandler-116.196.104.79:20881-thread-199] - [] - [] - [] - [] - [center=base-center] - [] - [com.jd.ecc.b2b.base.center.service.impl.ImgServiceImpl:uploadImg] - 上传图片至图片服务器失败
net.sf.jmimemagic.MagicMatchNotFoundException
        at net.sf.jmimemagic.Magic.getMagicMatch(Magic.java:222)
        at net.sf.jmimemagic.Magic.getMagicMatch(Magic.java:170)
        at com.jd.ecc.b2b.fastdfs.center.service.impl.HDFSServiceImpl.uploadImage(HDFSServiceImpl.java:149)
        at com.jd.ecc.b2b.fastdfs.center.service.impl.HDFSServiceImpl.uploadCdnImage(HDFSServiceImpl.java:136)
        at com.alibaba.dubbo.common.bytecode.Wrapper2.invokeMethod(Wrapper2.java)
        at com.alibaba.dubbo.rpc.proxy.javassist.JavassistProxyFactory$1.doInvoke(JavassistProxyFactory.java:45)
        at com.alibaba.dubbo.rpc.proxy.AbstractProxyInvoker.invoke(AbstractProxyInvoker.java:71)
        at com.alibaba.dubbo.config.invoker.DelegateProviderMetaDataInvoker.invoke(DelegateProviderMetaDataInvoker.java:48)
        at com.alibaba.dubbo.rpc.protocol.InvokerWrapper.invoke(InvokerWrapper.java:52)
        at com.alibaba.dubbo.rpc.filter.ExceptionFilter.invoke(ExceptionFilter.java:61)
        at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:68)
        at com.alibaba.dubbo.monitor.support.MonitorFilter.invoke(MonitorFilter.java:64)
        at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:68)
        at com.alibaba.dubbo.rpc.filter.TimeoutFilter.invoke(TimeoutFilter.java:41)
        at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:68)
        at com.alibaba.dubbo.rpc.protocol.dubbo.filter.TraceFilter.invoke(TraceFilter.java:77)
        at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:68)
        at com.alibaba.dubbo.rpc.filter.ContextFilter.invoke(ContextFilter.java:60)
        at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:68)
        at com.alibaba.dubbo.rpc.filter.GenericFilter.invoke(GenericFilter.java:131)
        at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:68)
        at com.alibaba.dubbo.rpc.filter.ClassLoaderFilter.invoke(ClassLoaderFilter.java:37)
        at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:68)
        at com.alibaba.dubbo.rpc.filter.EchoFilter.invoke(EchoFilter.java:37)
        at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:68)
        at com.alibaba.dubbo.rpc.protocol.dubbo.DubboProtocol$1.reply(DubboProtocol.java:95)
        at com.alibaba.dubbo.remoting.exchange.support.header.HeaderExchangeHandler.handleRequest(HeaderExchangeHandler.java:96)
        at com.alibaba.dubbo.remoting.exchange.support.header.HeaderExchangeHandler.received(HeaderExchangeHandler.java:168)
        at com.alibaba.dubbo.remoting.transport.DecodeHandler.received(DecodeHandler.java:50)
        at com.alibaba.dubbo.remoting.transport.dispatcher.ChannelEventRunnable.run(ChannelEventRunnable.java:79)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at java.lang.Thread.run(Thread.java:745)

到这里是知道原因,确实是上传图片的jar包依赖不支持这个bmp格式的图片。也不可能找替代方案。所以就只能前台规避掉这个bmp格式的图片,曲线救国了。
那就要解决两个问题;
1.如何获取图片的真实格式?
2.如何从MultipartFile中获取图片信息?
我们先从后往前看,看看获取图片的真实格式需要啥吧
这里用到工具类。先放到这。以备不时之需。。。

package com;

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;

import javax.imageio.ImageIO;
import javax.imageio.ImageReader;
import javax.imageio.stream.ImageInputStream;

import com.jd.ecc.b2b.utils.StringUtils;
import org.springframework.web.multipart.MultipartFile;

/**
 * 文件操作工具类
 * 
 */
public class FileUtils {
	public final static Map<String, String> FILE_TYPE_MAP = new HashMap<String, String>();
	static {
		getAllFileType(); // 初始化文件类型信息
	}

	/**
	 * 常见文件头信息
	 */
	private static void getAllFileType() {
		FILE_TYPE_MAP.put("jpg", "FFD8FF"); // JPEG (jpg)
		FILE_TYPE_MAP.put("png", "89504E47"); // PNG (png)
		FILE_TYPE_MAP.put("gif", "47494638"); // GIF (gif)
		FILE_TYPE_MAP.put("bmp", "424D"); // BMP (bmp)
	}

	/**
	 * 获取图片文件实际类型, 若不是图片则返回null
	 * @param f
	 * @return
	 */
	public final static String getImageFileType(File f) {
		if (isImage(f)) {
			try {
				ImageInputStream iis = ImageIO.createImageInputStream(f);
				Iterator<ImageReader> iter = ImageIO.getImageReaders(iis);
				if (!iter.hasNext()) {
					return null;
				}
				ImageReader reader = iter.next();
				iis.close();
				return reader.getFormatName();
			} catch (IOException e) {
				return null;
			} catch (Exception e) {
				return null;
			}
		}
		return null;
	}

	/**
	 * 获取文件类型, 包括图片, 若格式不是已匹配的, 则返回null 
	 * @param file
	 * @return
	 */
	public final static String getFileTypeByFile(File file) {
		String filetype = null;
		byte[] b = new byte[50];
		try {
			InputStream is = new FileInputStream(file);
			is.read(b);
			filetype = getFileTypeByStream(b);
			is.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return filetype;
	}

	public final static String getFileTypeByStream(byte[] b) {
		String filetypeHex = String.valueOf(getFileHexString(b));
		Iterator<Entry<String, String>> entryiterator = FILE_TYPE_MAP.entrySet().iterator();
		while (entryiterator.hasNext()) {
			Entry<String, String> entry = entryiterator.next();
			String fileTypeHexValue = entry.getValue();
			if (filetypeHex.toUpperCase().startsWith(fileTypeHexValue)) {
				return entry.getKey();
			}
		}
		return null;
	}

	/**
	 * 判断文件是否是图片
	 * @param file
	 * @return
	 */
	public static final boolean isImage(File file) {
		boolean flag = false;
		try {
			BufferedImage bufreader = ImageIO.read(file);
			int width = bufreader.getWidth();
			int height = bufreader.getHeight();
			if (width == 0 || height == 0) {
				flag = false;
			} else {
				flag = true;
			}
		} catch (IOException e) {
			flag = false;
		} catch (Exception e) {
			flag = false;
		}
		return flag;
	}

	public static final boolean isImage(MultipartFile file) {
		boolean flag = false;
		try {
			BufferedImage bufreader = ImageIO.read(file.getInputStream());
			int width = bufreader.getWidth();
			int height = bufreader.getHeight();
			if (width == 0 || height == 0) {
				flag = false;
			} else {
				flag = true;
			}
		} catch (IOException e) {
			flag = false;
		} catch (Exception e) {
			flag = false;
		}
		return flag;
	}
	
	public final static String getFileHexString(byte[] b) {
		StringBuilder stringBuilder = new StringBuilder();
		if (b == null || b.length <= 0) {
			return null;
		}
		for (int i = 0; i < b.length; i++) {
			int v = b[i] & 0xFF;
			String hv = Integer.toHexString(v);
			if (hv.length() < 2) {
				stringBuilder.append(0);
			}
			stringBuilder.append(hv);
		}
		return stringBuilder.toString();
	}

	/**
	 * 获取文件名后缀
	 * @param fileName
	 * @return
	 */
	public static String getFileSuffix(String fileName){
		if(StringUtils.isEmpty(fileName)){
			return "";
		}
		int i = fileName.lastIndexOf(".");
		if(i > -1 && i < (fileName.length() - 1)){
			return fileName.substring(i + 1);
		}else{
			return "";
		}
	}
}

然后这个工具类可以通过文件流获取图片的类型。这样就好办多了。我只需要从MultipartFile中获取文件流就行。
下面是对应的controller的上传方法

@RequestMapping(value = "ajaxFileUpload", method = RequestMethod.POST)
	public ModelAndView ajaxFileUpload(MultipartHttpServletRequest multipartRequest, HttpServletResponse response,
			@RequestParam("fileName") String fileName) throws IOException {
		fileName = StringUtils.replaceTag(fileName);

		Map<String, Object> result = new HashMap<String, Object>();
		result.put("errorMsg", "");

		DefaultMultipartHttpServletRequest defaultRequest = (DefaultMultipartHttpServletRequest) multipartRequest;
		MultiValueMap<String, MultipartFile> fileMap = defaultRequest.getMultiFileMap();
		// 得到上传文件
		List<MultipartFile> fileList = fileMap.get(fileName);
		MultipartFile file = fileList.get(0);
		
		if (!FileUtils.isImage(file)) {
			result.put("errorMsg", "文件类型不正确");
		}else {
			
			byte[] b = new byte[50];
			String fileType = null;
			InputStream is=null;
			try {
				is = file.getInputStream();
				is.read(b);
				fileType = FileUtils.getFileTypeByStream(b);
			} catch (FileNotFoundException e) {
				logger.error("获取图片类型异常", e);
			} catch (IOException e) {
				logger.error("获取图片类型异常", e);
			}finally {
				is.close();
			}
			
			if (file.getSize() > 1024000) {
				result.put("errorMsg", "图片超过了1M");
			}else if("bmp".equals(fileType)){
				result.put("errorMsg", "不支持的图片格式类型");
			} else {
				String url = null;
				try {
					url = uploadImage(file);
				} catch (Exception e) {
					logger.error("上传图片出错", e);
					result.put("errorMsg", "系统错误,请稍候再试");
				}
				result.put("url",URLEncoder.encode(url,"utf-8"));
			}
		}
		response.setContentType("text/html; charset=utf-8");
		try {
			Writer writer = response.getWriter();
			writer.write(JSON.toJSONString(result));
			writer.flush();
			writer.close();
		} catch (Exception e) {
			logger.error("上传文件后,write异常", e);
		}
		return null;
	}

具体实现都在代码里。这样就算解决了。

猜你喜欢

转载自blog.csdn.net/zhanglf02/article/details/86686964