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



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

编码,就不会出现文件乱码



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



四、逻辑如下



前端





<!DOCTYPE html>
<html>
<head>
<title>柳絮飞祭奠</title> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="this is my page">
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<link rel="stylesheet" href="../plugins/webuploader/webuploader.css"
type="text/css"></link>
</head>
<body class="lx_droparea">
<lx-upload droparea="lx_droparea" id="upload" type="button" value="上传" style="width:80px;"></lx-ui-upload>
</body>
<script type="text/javascript" src="../plugins/jquery.js"></script>
<script type="text/javascript" src="../plugins/angular.min.js"></script>
<script type="text/javascript"
src="../plugins/webuploader/webuploader.min.js"></script> <script type="text/javascript">
//设置lx.upload的配置信息
var $$runtime = {file:'/JerseyTest/api/1.0/my/upload', "swf":"",debug : true}; var lxUpload=angular.module("lx.upload",[]); /**
*
*
*/
lxUpload.directive('lxUpload',function(){
var option = {
restrict : 'E',
replace : true,
template : '<div>上传文件</div>',
scope:true,
link : function($scope, $element, $attrs) {
//声明作用域内上传数据对象
$scope.upload={"id":"","droparea":"","md5":"","length":0,"data":[],"tip":true,"isupload":false};
//设置上传文件id
$scope.upload.id="#"+$attrs.id;
$scope.upload.droparea="."+$attrs.droparea;
WebUploader.Uploader.register({
"before-send-file" : "beforeSendFile"
}, {
// 时间点1:所有分块进行上传之前调用此函数
beforeSendFile : function(file) {
var deferred = WebUploader.Deferred();
// 1、使用md5计算文件的唯一标记,用于断点续传
uploader.md5File(file).then(function(val) {
$scope.upload.md5= val;
console.log($scope.upload.md5);
// 2.1.5延迟解决
deferred.resolve();
});
return deferred.promise();
},
});
var uploader = WebUploader.create({
// swf文件路径
swf : $$runtime.swf,
// 文件接收服务端。
server : $$runtime.file,
// 选择文件的按钮。可选。
// 内部根据当前运行是创建,可能是input元素,也可能是flash.
pick : {
id : $scope.upload.id,
// 这个id是你要点击上传文件的id,自己设置就好</span>
multiple : true
},
// 不压缩image, 默认如果是jpeg,文件上传前会压缩一把再上传!
resize : true,
dnd:$scope.upload.droparea,
auto : true,
// 上传并发数
threads : 5,
// 开启分片上传
chunked : true,
chunkSize : 1 * 1024 * 1024,
duplicate :true
});
// // 声明WebUploader内【uploadBeforeSend】事件
// uploader.on("beforeFileQueued", function(file) {
// if(!$scope.upload.isupload){
// $$alert("请选择文件夹",3);
// return false;
// }
// });
// 声明WebUploader内【uploadBeforeSend】事件
uploader.on("fileQueued", function(block, data) {
if($scope.upload.tip){
}
$scope.upload.length++;
// wenbuploader添加携带参数
});
// 声明WebUploader内【uploadBeforeSend】事件
uploader.on("uploadBeforeSend", function(block, data) {
// wenbuploader添加携带参数
console.log($scope.upload.md5);
data.fileMd5 = $scope.upload.md5;
});
// 声明WebUploader内【uploadSuccess】事件
uploader.on("uploadSuccess", function(file, response) {
$scope.upload.data.push(response[0]);
$scope.upload.length--;
if($scope.upload.length==0){
$scope.$emit('upload', $scope.upload.data);
$scope.upload.data=[];
}
});
}
};
return option;
});
//启动应用程序
angular.bootstrap(document,['lx.upload']);
</script>
</html>

后端



@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<FileItem> 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<String, Object> nFileMap = new HashMap<String, Object>();
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. Jersey RESTful WebService框架学习(八)文件下载防乱码

    最近在做下载时候  不同浏览器下载的文件一直出现乱码,不知道怎么设置文件的编码,百度许久,找到一个解决办法如下 /** * 文件下载 * @param request * @return */ @GE ...

  2. Jersey框架一:Jersey RESTful WebService框架简介

    Jersey系列文章: Jersey框架一:Jersey RESTful WebService框架简介 Jersey框架二:Jersey对JSON的支持 Jersey框架三:Jersey对HTTPS的 ...

  3. jersey框架实现文件上传

    jersey框架是一个开源的RESTful的框架,实现了实现了JAX-RS规范,进一步地简化 RESTful service 和 client 开发.当然而且是必须的,jersey对文件的上传和下载也 ...

  4. layUI框架中文件上传前后端交互及遇到的相关问题

    下面我将讲述一下我在使用layUI框架中文件上传所遇到的问题: 前端jsp页面: <div class="layui-form-item"> <label cla ...

  5. node.js使用express框架进行文件上传

    关于node.js使用express框架进行文件上传,主要来自于最近对Settings-Sync插件做的研究.目前的研究算是取得的比较好的进展.Settings-Sync中通过快捷键上传文件,其实主要 ...

  6. 使用SpringMVC框架实现文件上传和下载功能

    使用SpringMVC框架实现文件上传和下载功能 (一)单个文件上传 ①配置文件上传解释器 <!—配置文件上传解释器 --> <mvc:annotation-driven>&l ...

  7. 关于我使用spring mvc框架做文件上传时遇到的问题

    非常感谢作者 原文:https://blog.csdn.net/lingirl/article/details/1714806 昨天尝试着用spring mvc框架做文件上传,犯了挺多不该犯的毛病问题 ...

  8. SpringMVC框架06——文件上传与下载

    1.文件上传 Spring MVC框架的文件上传是基于commons-fileupload组件的文件上传,只不过Spring MVC框架在原有文件上传组件上做了进一步封装,简化了文件上传的代码实现. ...

  9. 笨鸟先飞之Java(一)--使用struts2框架实现文件上传

    无论是.net还是Java,我们最常接触到的就是文件的上传和下载功能,在Java里要实现这两个经常使用功能会有非常多种解决方案,可是struts2的框架却能给我们一个比較简单的方式,以下就一起来看吧: ...

随机推荐

  1. 用GDB调试程序(六)

    七.设置显示选项 GDB中关于显示的选项比较多,这里我只例举大多数常用的选项. set print address     set print address on         打开地址输出,当程 ...

  2. 八(第一篇)、主体结构元素——article元素、section元素

    article元素 article元素代表文档.页面或应用程序中独立的.完整的.可以独自被外部引用的内容. 他可以是一篇博客或者报刊中的文章,一篇轮胎帖子.一段用户评论或独立的插件,或其他任何独立的插 ...

  3. day38数据库MySQL基础

    数据库相关基础1 数据库介绍 1.数据库相关概念  数据库服务器(本质就是一个台计算机,该计算机之上安装有数据库管理软件的服务端)  数据库管理管理系统RDBMS(本质就是一个C/S架构的套接字软件) ...

  4. python基础之数字、字符串、列表、元组、字典

    Python基础二: 1.运算符: 判断某个东西是否在某个东西里面包含: in  为真 not in  为假 (1).算术运算符: 运算符 描述 实例 + 加  表示两个对象相加 a + b输出结果3 ...

  5. Halcon除法

    今天,用到了Halcon 的除法.求出两个region的面积,area1,area2.我想求出它们的比值area1/area2.但是发现比值是整数,没有保留小数.应该改为这样area1/real(ar ...

  6. leetcode309

    使用动态规划,下面的代码可以通过210个测试,最后1个(第211个)会超时.说明思路是正确的,但是其中有一些是无效的计算. class Solution { public: int maxProfit ...

  7. IOS 发布 升级新版本

    ERROR ITMS-90725: "SDK Version Issue. ERROR ITMS-90725: "SDK Version Issue. This app was b ...

  8. Mad Lids游戏 华氏与摄氏温度转换

    name1 = input('请输入一个名字:') name2 = input('请输入一个名字:') vehicle = input('请输入一种车子:') print('\n上近代史的{}刚下课, ...

  9. 使用jQuery+huandlebars判断类型的helper

    兼容ie8(很实用,复制过来,仅供技术参考,更详细内容请看源地址:http://www.cnblogs.com/iyangyuan/archive/2013/12/12/3471227.html) & ...

  10. week06 codelab01 react-router 去官网学习

    官方教程https://github.com/reactjs/react-router-tutorial git clone 到本地 和教程学 第一课 LESSON 2 index.js引入一些pac ...