最近碰到这个问题,页面上传图片,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;
}
具体实现都在代码里。这样就算解决了。