一、当我们使用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. MyISAM与InnoDB两者之间区别与选择,详细总结,性能对比

    1.MyISAM:默认表类型,它是基于传统的ISAM类型,ISAM是Indexed Sequential Access Method (有索引的顺序访问方法) 的缩写,它是存储记录和文件的标准方法.不 ...

  2. SpringMVC - 运行流程图及原理分析

    流程示意图: 代码分析图:

  3. hive的使用

    1,前言 书接上回,接着对上一个hive安装后环境下的hive使用.

  4. 说下spring生命周期

    面试官:说下spring生命周期 程序员:不会 那你先回去等消息吧     Bean实现了BeanNameAware,Spring会将Bean的ID透传给setBeanName java.后端开发.程 ...

  5. GC(垃圾处理机制)面试题

    1: 详细解释Java中垃圾收集的主要流程.  垃圾收集主要有两种形式:手工.自动 自动会不定期进行回收,以释放无用的空间 手工调用的是System类中的gc()方法,此方法实际上调用的是Runtim ...

  6. Laravel数据库操作 Eloquent ORM

    模型首先在App目录下建立student的文件夹 里面放上 Student.php 且需要继承基类Model //允许批量赋值的字段// protected $fillable = ['name',' ...

  7. Python代码教你批量将PDF转为Word

    很多时候在学习时发现许多文档都是PDF格式,PDF格式却不利于学习使用,因此需要将PDF转换为Word文件,但或许你从网上下载了很多软件,但只能转换前五页(如WPS等),要不就是需要收费,那有没有免费 ...

  8. Rocket MQ 1 - 用

    参考 http://www.iocoder.cn/categories/RocketMQ/ ; https://www.jianshu.com/nb/16219849 首先上启动方法,分别启动name ...

  9. 【Noip模拟 20160929】选数

    题目描述 现在有一排共N个数,你需要从中选出恰好K个.选出K个数后,计算它们两两差值的绝对值的最小值S.你需要确定选出哪K个,才能最大化这个S. 输入数据 输入第一行两个正整数N.K,含义如上. 输入 ...

  10. BASIC GIT WORKFLOW

    BASIC GIT WORKFLOW Generalizations You have now been introduced to the fundamental Git workflow. You ...