一、当我们使用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. web监控,if 语句

    对页面的测试  curl "] #if [`curl -I http://10.0.0.7 &>/dev/null|head -l|grep 200|wc -l` -eq 1] ...

  2. 【转】修改mysql数据库的用户名和密码

    修改mysql数据库的用户名和密码 更改密码 mysql -u root -p Enter password:*** mysql>use mysql; 选择数据库 Database change ...

  3. leetcode1029

    class Solution(object): def twoCitySchedCost(self, costs: 'List[List[int]]') -> int: costs = sort ...

  4. Python3 timeit的用法

    Python3中的timeit模块可以用来测试小段代码的运行时间 其中主要通过两个函数来实现:timeit和repeat,代码如下: def timeit(stmt="pass", ...

  5. Keepalived+MySQL实现高可用

    MySQL的高可用方案有很多,比如Cluster,MMM,MHA,DRBD等,这些都比较复杂,我前面的文章也有介绍.最近Oracle官方也推出了Fabric.有时我们不需要这么复杂的环境,这些方案各有 ...

  6. java 自动补全

    int youNumber = 1; // 0 代表前面补充0 // 4 代表长度为4 // d 代表参数为正数型 String str = String.format("%04d" ...

  7. hikari链接池

    # 链接池 hikari: # 等待连接池分配连接的最大时长(毫秒),超过这个时长还没可用的连接则发生SQLException, 缺省:30秒 connection-timeout: 60000 # ...

  8. cdnbest日志分析显示404的原因

    日志分析报404原因 报这个提示一般是日志没有开启或还没有日志 检查下面几点: 开启和关闭站点日志在节点3311中显示如下图nolog是关闭  日志翻转目前默认是1个小时以后会默认改成20分钟,翻转时 ...

  9. cdnbest设置301跳转

     cdnbest设置301跳转  格式:^http://kangleweb.com/(.*)$   https://www.kangleweb.com/$1  下面是站点里所有域名都跳转到https ...

  10. poj2115(扩展欧基里德定理)

    题目链接:https://vjudge.net/problem/POJ-2115 题意:模拟for循环for(int i=A;i!=B;i+=C),且数据范围为k位无符号数以内,即0~1<< ...