巧用 Jersey RESTful WebService框架解决文件上传乱码
一、当我们使用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框架解决文件上传乱码的更多相关文章
- Jersey RESTful WebService框架学习(八)文件下载防乱码
最近在做下载时候 不同浏览器下载的文件一直出现乱码,不知道怎么设置文件的编码,百度许久,找到一个解决办法如下 /** * 文件下载 * @param request * @return */ @GE ...
- Jersey框架一:Jersey RESTful WebService框架简介
Jersey系列文章: Jersey框架一:Jersey RESTful WebService框架简介 Jersey框架二:Jersey对JSON的支持 Jersey框架三:Jersey对HTTPS的 ...
- jersey框架实现文件上传
jersey框架是一个开源的RESTful的框架,实现了实现了JAX-RS规范,进一步地简化 RESTful service 和 client 开发.当然而且是必须的,jersey对文件的上传和下载也 ...
- layUI框架中文件上传前后端交互及遇到的相关问题
下面我将讲述一下我在使用layUI框架中文件上传所遇到的问题: 前端jsp页面: <div class="layui-form-item"> <label cla ...
- node.js使用express框架进行文件上传
关于node.js使用express框架进行文件上传,主要来自于最近对Settings-Sync插件做的研究.目前的研究算是取得的比较好的进展.Settings-Sync中通过快捷键上传文件,其实主要 ...
- 使用SpringMVC框架实现文件上传和下载功能
使用SpringMVC框架实现文件上传和下载功能 (一)单个文件上传 ①配置文件上传解释器 <!—配置文件上传解释器 --> <mvc:annotation-driven>&l ...
- 关于我使用spring mvc框架做文件上传时遇到的问题
非常感谢作者 原文:https://blog.csdn.net/lingirl/article/details/1714806 昨天尝试着用spring mvc框架做文件上传,犯了挺多不该犯的毛病问题 ...
- SpringMVC框架06——文件上传与下载
1.文件上传 Spring MVC框架的文件上传是基于commons-fileupload组件的文件上传,只不过Spring MVC框架在原有文件上传组件上做了进一步封装,简化了文件上传的代码实现. ...
- 笨鸟先飞之Java(一)--使用struts2框架实现文件上传
无论是.net还是Java,我们最常接触到的就是文件的上传和下载功能,在Java里要实现这两个经常使用功能会有非常多种解决方案,可是struts2的框架却能给我们一个比較简单的方式,以下就一起来看吧: ...
随机推荐
- web监控,if 语句
对页面的测试 curl "] #if [`curl -I http://10.0.0.7 &>/dev/null|head -l|grep 200|wc -l` -eq 1] ...
- 【转】修改mysql数据库的用户名和密码
修改mysql数据库的用户名和密码 更改密码 mysql -u root -p Enter password:*** mysql>use mysql; 选择数据库 Database change ...
- leetcode1029
class Solution(object): def twoCitySchedCost(self, costs: 'List[List[int]]') -> int: costs = sort ...
- Python3 timeit的用法
Python3中的timeit模块可以用来测试小段代码的运行时间 其中主要通过两个函数来实现:timeit和repeat,代码如下: def timeit(stmt="pass", ...
- Keepalived+MySQL实现高可用
MySQL的高可用方案有很多,比如Cluster,MMM,MHA,DRBD等,这些都比较复杂,我前面的文章也有介绍.最近Oracle官方也推出了Fabric.有时我们不需要这么复杂的环境,这些方案各有 ...
- java 自动补全
int youNumber = 1; // 0 代表前面补充0 // 4 代表长度为4 // d 代表参数为正数型 String str = String.format("%04d" ...
- hikari链接池
# 链接池 hikari: # 等待连接池分配连接的最大时长(毫秒),超过这个时长还没可用的连接则发生SQLException, 缺省:30秒 connection-timeout: 60000 # ...
- cdnbest日志分析显示404的原因
日志分析报404原因 报这个提示一般是日志没有开启或还没有日志 检查下面几点: 开启和关闭站点日志在节点3311中显示如下图nolog是关闭 日志翻转目前默认是1个小时以后会默认改成20分钟,翻转时 ...
- cdnbest设置301跳转
cdnbest设置301跳转 格式:^http://kangleweb.com/(.*)$ https://www.kangleweb.com/$1 下面是站点里所有域名都跳转到https ...
- poj2115(扩展欧基里德定理)
题目链接:https://vjudge.net/problem/POJ-2115 题意:模拟for循环for(int i=A;i!=B;i+=C),且数据范围为k位无符号数以内,即0~1<< ...