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:
/** * 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
- Jersey2xjersey-media-multipart+Jetty实现文件上传下载
- SpringMVC multipart文件上传下载
- springmvc + multipart 实现文件上传
- jspsmart实现文件上传下载
- jspsmart实现文件上传下载
- c#实现文件上传下载
- jspSmartUpload 实现文件上传下载
- BCB实现文件上传下载
- jspsmart实现文件上传下载
- jsp实现文件上传下载
- 文件流实现上传下载
- iOS-实现文件上传下载
- YII实现文件上传下载
- iOS-实现文件上传下载 .
- iOS 实现文件上传下载
- socket 实现文件上传下载
- GWT实现文件上传下载
- C#实现文件上传下载
- ORACE 非归档模式redo文件恢复
- 广度搜索加奇偶剪枝
- Java入门学习-深入理解集合
- Codeforces 804D
- shell连接linux失败问题
- Jersey2xjersey-media-multipart+Jetty实现文件上传下载
- HTML5实现音频和视频嵌入
- 【多线程研究专题三】【FutureTask与Callable的本质】
- Linux常用命令(2)(欢迎指正,持续更新)
- Predict the Winner
- 日期格式DateFormat使用
- sed命令入门及进阶
- dot-files/directories 点开头的文件或文件夹(windows/linux)
- Visual Studio Code 常用快捷键