Jersey2xjersey-media-multipart+Jetty实现文件上传下载

来源:互联网 发布:mac 微软雅黑字体关了 编辑:程序博客网 时间:2024/05/29 15:20

前一段时间写了Jersey+Jetty搭建后台框架,使用的是Jersey1.19版本,写上传下载文件时引入jersey-media-multipart依赖是2.0版本的,索性把整个框架都升级到2.0版本了。

jersey1x和2x的区别我就不详细说了,只提供修改点。

主要是资源文件检测的包改变了,还有ServletContainer从1x是com.sun.jersey.spi.container.servlet.ServletContainer切换为2x的org.glassfish.jersey.servlet.ServletContainer。

1x的Jersey依赖是:

<dependency><groupId>com.sun.jersey</groupId><artifactId>jersey-servlet</artifactId><version>1.19</version></dependency>
2x的依赖是:

<dependency><groupId>org.glassfish.jersey.containers</groupId><artifactId>jersey-container-servlet-core</artifactId><version>2.0</version></dependency>


先截图看下整体文件的分布情况,跟之前搭建的Jersey框架大体上是差不多的:



依赖增加

<dependency><groupId>org.glassfish.jersey.media</groupId><artifactId>jersey-media-multipart</artifactId><version>2.0</version></dependency><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.4</version></dependency>


框架中增加了AbstractFileDownloadAction下载文件Action抽象类和AbstractFileUploadAction上传文件Action抽象类,屏蔽掉文件处理过程。

AbstractFileDownloadAction:

/** * 2017年4月29日 黑苹果 */package com.black.apple.framework.jersey.rest.action.common;import java.io.File;import java.io.UnsupportedEncodingException;import java.net.URLEncoder;import java.util.HashMap;import java.util.Map;import java.util.Map.Entry;import javax.servlet.http.HttpServletRequest;import javax.ws.rs.core.MediaType;import javax.ws.rs.core.Response;import javax.ws.rs.core.Response.Status;import org.apache.commons.lang3.StringUtils;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import com.black.apple.framework.exception.FrameworkErrorCode;import com.black.apple.framework.exception.FrameworkException;import com.black.apple.framework.jersey.utils.JsonDecodeUtil;/** * @author 黑苹果 2017年4月29日 */public abstract class AbstractFileDownloadAction{    private static final Logger LOGGER = LoggerFactory.getLogger(AbstractFileDownloadAction.class);    /**     * Action主方法     *      * @param request     *            request     * @return Response     */    public Response execute(final HttpServletRequest request)    {        Response response;        try        {            Map<String, String> s = decodeParam(request);            validateParam(s);            File file = doAction(s);            response = buildSuccessResponse(file);        }        catch (FrameworkException e)        {            LOGGER.error("FrameworkException.", e);            response = buildErrorResponse(e);        }        catch (Exception e)        {            LOGGER.error("Exception.", e);            response = buildErrorResponse(e);        }        return response;    }    private Map<String, String> decodeParam(HttpServletRequest httpRequest) throws FrameworkException    {        Map<String, String> paramMap = new HashMap<String, String>();        if (httpRequest.getParameterMap().isEmpty())        {            return paramMap;        }        for (Entry<String, String[]> paramEntry : httpRequest.getParameterMap().entrySet())        {            String key = paramEntry.getKey();            String[] values = paramEntry.getValue();            if (values.length < 1)            {                continue;            }            paramMap.put(key, values[0]);        }        return paramMap;    }    private Response buildErrorResponse(Exception e)    {        return Response                .status(Status.SERVICE_UNAVAILABLE)                .type(MediaType.APPLICATION_JSON)                .entity(encodeJson(new ErrorResp(FrameworkErrorCode.UNKNOW_EXCEPTION.toString(),                        FrameworkErrorCode.UNKNOW_EXCEPTION.toString()))).build();    }    private Response buildErrorResponse(FrameworkException e)    {        return Response.status(Status.SERVICE_UNAVAILABLE).type(MediaType.APPLICATION_JSON)                .entity(encodeJson(new ErrorResp(e.getErrorCode(), e.getErrorCode()))).build();    }    private Response buildSuccessResponse(File file)    {        String fileName = null;        try        {            fileName = URLEncoder.encode(file.getName(), "UTF-8");        }        catch (UnsupportedEncodingException e)        {            LOGGER.error("encode fileName failed.fileName={}", file.getName(), e);        }        return Response.ok(file).header("Content-disposition", "attachment;filename=" + fileName)                .header("Cache-Control", "no-cache").build();    }    private <O> String encodeJson(O obj)    {        try        {            String json = JsonDecodeUtil.encode(obj);            return json;        }        catch (FrameworkException e)        {            LOGGER.error("json decode failed.obj={}", obj, e);        }        return StringUtils.EMPTY;    }    protected abstract File doAction(Map<String, String> paramMap) throws FrameworkException;    protected abstract void validateParam(Map<String, String> paramMap) throws FrameworkException;}


AbstractFileUploadAction:

/** * 2017年4月29日 黑苹果 */package com.black.apple.framework.jersey.rest.action.common;import java.io.File;import java.io.InputStream;import java.util.List;import java.util.Map.Entry;import javax.servlet.http.HttpServletRequest;import javax.ws.rs.core.MediaType;import javax.ws.rs.core.Response;import javax.ws.rs.core.Response.Status;import org.apache.commons.lang3.StringUtils;import org.glassfish.jersey.media.multipart.FormDataBodyPart;import org.glassfish.jersey.media.multipart.FormDataMultiPart;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import com.black.apple.framework.exception.FrameworkErrorCode;import com.black.apple.framework.exception.FrameworkException;import com.black.apple.framework.jersey.utils.FileUtil;import com.black.apple.framework.jersey.utils.JsonDecodeUtil;import com.black.apple.framework.persistence.utils.CollectionUtils;/** * @author 黑苹果 2017年4月29日 */public abstract class AbstractFileUploadAction<T>{    private static final Logger LOGGER = LoggerFactory.getLogger(AbstractFileUploadAction.class);    /**     * Action主方法     *      * @param form     *            form     * @param request     *            request     * @return Response     */    public Response execute(final FormDataMultiPart form, final HttpServletRequest request)    {        Response response;        FileUploadReq s = null;        try        {            s = decodeParam(form, request);            validateParam(s);            T t = doAction(s);            String responseJson = encodeJson(t);            response = buildSuccessResponse(responseJson);        }        catch (FrameworkException e)        {            LOGGER.error("FrameworkException.", e);            response = buildErrorResponse(e);        }        catch (Exception e)        {            LOGGER.error("Exception.", e);            response = buildErrorResponse(e);        }        finally        {            clearFileResources(s.getFiles());        }        return response;    }    /**     * 请注意!! 上传文件请求结束之后文件会自动清除,如果需要开启线程处理文件的解析的话,一定要复制一份文件     */    private void clearFileResources(List<File> files)    {        if (CollectionUtils.isEmpty(files))        {            return;        }        for (File file : files)        {            try            {                file.delete();            }            catch (Exception e)            {                LOGGER.error("delete file failed.file={}", file, e);            }        }    }    private FileUploadReq decodeParam(FormDataMultiPart form, HttpServletRequest httpRequest) throws FrameworkException    {        FileUploadReq request = new FileUploadReq();        decodeFormParam(form, request);        decodeRequestParam(httpRequest, request);        return request;    }    private void decodeRequestParam(final HttpServletRequest httpRequest, final FileUploadReq request)    {        if (httpRequest.getParameterMap().isEmpty())        {            return;        }        for (Entry<String, String[]> paramEntry : httpRequest.getParameterMap().entrySet())        {            String key = paramEntry.getKey();            String[] values = paramEntry.getValue();            if (values.length < 1)            {                continue;            }            request.addParam(key, values[0]);        }    }    private void decodeFormParam(final FormDataMultiPart form, final FileUploadReq request) throws FrameworkException    {        if (form.getFields().isEmpty())        {            return;        }        if (CollectionUtils.isEmpty(form.getFields().values()))        {            return;        }        for (List<FormDataBodyPart> fields : form.getFields().values())        {            for (FormDataBodyPart field : fields)            {                if (isSimpleType(field.getMediaType()))                {                    request.addParam(field.getName(), field.getValue());                }                else                {                    final String fileName = field.getContentDisposition().getFileName();                    final String filePrefix = FileUtil.getFileNamePrefix(fileName);                    final String fileSuffix = FileUtil.getFileNameSuffix(fileName);                    request.addFile(FileUtil.generateTempFile(filePrefix, fileSuffix,                            field.getValueAs(InputStream.class)));                }            }        }    }    private boolean isSimpleType(MediaType mediaType)    {        return MediaType.TEXT_PLAIN_TYPE.isCompatible(mediaType);    }    private Response buildErrorResponse(Exception e)    {        return Response                .status(Status.SERVICE_UNAVAILABLE)                .type(MediaType.APPLICATION_JSON)                .entity(encodeJson(new ErrorResp(FrameworkErrorCode.UNKNOW_EXCEPTION.toString(),                        FrameworkErrorCode.UNKNOW_EXCEPTION.toString()))).build();    }    private Response buildErrorResponse(FrameworkException e)    {        return Response.status(Status.SERVICE_UNAVAILABLE).type(MediaType.APPLICATION_JSON)                .entity(encodeJson(new ErrorResp(e.getErrorCode(), e.getErrorCode()))).build();    }    private Response buildSuccessResponse(String responseJson)    {        return Response.ok(responseJson, MediaType.APPLICATION_JSON).build();    }    private <O> String encodeJson(O obj)    {        try        {            String json = JsonDecodeUtil.encode(obj);            return json;        }        catch (FrameworkException e)        {            LOGGER.error("json decode failed.obj={}", obj, e);        }        return StringUtils.EMPTY;    }    protected abstract T doAction(FileUploadReq request) throws FrameworkException;    protected abstract void validateParam(FileUploadReq request) throws FrameworkException;}


UploadRestService:

/** * 2017年4月29日 黑苹果 */package com.black.apple.framework.jersey.rest.service;import javax.servlet.http.HttpServletRequest;import javax.ws.rs.Consumes;import javax.ws.rs.GET;import javax.ws.rs.POST;import javax.ws.rs.Path;import javax.ws.rs.Produces;import javax.ws.rs.core.Context;import javax.ws.rs.core.MediaType;import javax.ws.rs.core.Response;import org.glassfish.jersey.media.multipart.FormDataMultiPart;import com.black.apple.framework.jersey.rest.action.UserDownloadAction;import com.black.apple.framework.jersey.rest.action.UserImportAction;/** * @author 黑苹果 2017年4月29日 */@Path("framework/user")public class UploadRestService{    @POST    @Path("upload")    @Consumes(MediaType.MULTIPART_FORM_DATA)    @Produces(MediaType.APPLICATION_JSON)    public Response upload(FormDataMultiPart form, @Context HttpServletRequest request)    {        return new UserImportAction().execute(form, request);    }    @GET    @Path("download")    @Produces(MediaType.APPLICATION_OCTET_STREAM)    public Response download(@Context HttpServletRequest request)    {        return new UserDownloadAction().execute(request);    }}



Jersey和Jetty的启动类有修改:

JerseyServerStarter:

/** * 2017年4月29日 黑苹果 */package com.black.apple.framework.jersey.rest.service;import org.eclipse.jetty.server.Server;import org.eclipse.jetty.servlet.ServletContextHandler;import org.eclipse.jetty.servlet.ServletHolder;import org.glassfish.jersey.servlet.ServletContainer;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import com.black.apple.framework.exception.FrameworkErrorCode;import com.black.apple.framework.exception.FrameworkException;import com.black.apple.framework.main.ServiceStarter;/** * @author 黑苹果 2017年4月29日 */public class JerseyServerStarter implements ServiceStarter{    private static final Logger LOGGER = LoggerFactory.getLogger(JerseyServerStarter.class);    private static final int PORT = 8687;    private Server server;    /*     * (non-Javadoc)     *      * @see com.black.apple.framework.main.ServiceStarter#callback()     */    @Override    public void start() throws FrameworkException    {        server = new Server(PORT);        ServletHolder servlet = new ServletHolder(ServletContainer.class);        servlet.setInitParameter("jersey.config.server.provider.classnames",                "org.glassfish.jersey.media.multipart.MultiPartFeature");        servlet.setInitParameter("jersey.config.server.provider.packages",                "com.black.apple.framework.jersey.rest.service");        ServletContextHandler handler = new ServletContextHandler(ServletContextHandler.SESSIONS);        handler.setContextPath("/");        handler.addServlet(servlet, "/*");        server.setHandler(handler);        try        {            server.start();        }        catch (Exception e)        {            LOGGER.error("Error in start jersey server.", e);            throw new FrameworkException(FrameworkErrorCode.JERSEY_SERVICE_START_FAILED, e);        }    }    /*     * (non-Javadoc)     *      * @see com.black.apple.framework.main.ServiceStarter#stop()     */    @Override    public void stop()    {        try        {            server.stop();        }        catch (Exception e)        {            LOGGER.error("Error in stop jersey server.", e);        }    }}

如果需要使用jersey-media-multipart需要配置MultiPartFeature,将其添加到Provider扫描中。


详细的源码在百度网盘中获取:

http://pan.baidu.com/s/1slvwZQP

0 0
原创粉丝点击