巧用 Jersey RESTful WebService框架解决文件上传乱码

阅读更多
一、当我们使用jersey框架封装的restful进行文件上传时,会出现中文乱码,试用了过滤器设置编码都不管用。仔细想了很久解决办法,就用一个servelt来代替这个上传的restful接口实现上传的逻辑。

二、不过后来对restful设计风格和jersey底层的初步研究,发现其实可以使用jersey作为入口来接收文件流,处理还是用apache提供的commons-fileupload-1.3.1.jar来实现,内部request请求设置
编码,就不会出现文件乱码

三、前端依旧是angular封装百度提供的webupload指令实现文件的上传和分片存储

四、逻辑如下

前端





柳絮飞祭奠
















后端


@POST
	@Path("/upload")
	@Produces({ MediaType.APPLICATION_JSON + ";charset=UTF-8" })
	public String upload(@Context HttpServletRequest request)
			throws UnsupportedEncodingException {
		request.setCharacterEncoding("UTF-8");
		// 获取或设置md5值
		String nFileMd5 = null;
		// 获取或设置分片数值
		String nChunk = "0";
		// 文件地址拿去到配置中
		File dir = new File(WebConfig.MAIN_UPLOAD_PATH);
		if (!dir.exists()) {
			if (!dir.mkdirs()) {
				throw new RuntimeException("Directory "
						+ WebConfig.MAIN_UPLOAD_PATH
						+ " not exists and can not create directory.");
			}
		}
		File nDirCACHE_PATH = new File(WebConfig.MAIN_UPLOAD_CACHE_PATH);
		if (!nDirCACHE_PATH.exists()) {
			if (!nDirCACHE_PATH.mkdirs()) {
				throw new RuntimeException("Directory "
						+ WebConfig.MAIN_UPLOAD_CACHE_PATH
						+ " not exists and can not create directory.");
			}
		}
		// 验证上传内容了类型
		String contentType = request.getContentType();
		if ((contentType.indexOf("multipart/form-data") >= 0)) {
			DiskFileItemFactory factory = new DiskFileItemFactory();
			// 设置内存中存储文件的最大值
			factory.setSizeThreshold(WebConfig.MAIN_UPLOAD_MAXSIZE);
			factory.setSizeThreshold(WebConfig.MAIN_UPLOAD_MEMORY_THRESHOLD);
			// 设置缓存路径
			factory.setRepository(new File(WebConfig.MAIN_UPLOAD_CACHE_PATH));
			// 创建一个新的文件上传处理程序
			ServletFileUpload upload = new ServletFileUpload(factory);
			// 设置最大上传的文件大小
			upload.setFileSizeMax(WebConfig.MAIN_UPLOAD_MAXSIZE);
			upload.setSizeMax(WebConfig.MAIN_UPLOAD_MAX_REQUEST_SIZE);

			try {
				// 解析获取的文件
				List formItems = upload.parseRequest(request);
				for (FileItem file : formItems) {
					if (file.isFormField()) {
						String fieldName = file.getFieldName();
						if (fieldName.equals("fileMd5")) {
							// 10.2.1.获取md5值
							nFileMd5 = file.getString("utf-8");
						}
						if (fieldName.equals("chunk")) {
							// 10.2.2.获取分片数值
							nChunk = file.getString("utf-8");
						}
					} else {
						Map nFileMap = new HashMap();
						String nFileName = file.getName();
						File nFile = new File(WebConfig.MAIN_UPLOAD_PATH
								+ File.separator + nFileMd5);
						if (!nFile.exists()) {
							nFile.mkdir();
						}
						file.write(new File(WebConfig.MAIN_UPLOAD_PATH
								+ File.separator + nFileMd5 + File.separator
								+ nChunk));
						if (file.isInMemory()) {
							file.delete();
						}
					}
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		return "";
	}



ending  附件带示例
  • 巧用 Jersey RESTful WebService框架解决文件上传乱码_第1张图片
  • 大小: 34.2 KB
  • 巧用 Jersey RESTful WebService框架解决文件上传乱码_第2张图片
  • 大小: 186 Bytes
  • JerseyTest_Maven_Webapp.zip (189.6 KB)
  • 下载次数: 6
  • 查看图片附件

你可能感兴趣的:(webservice,上传)