有个朋友之前一直用SSM,后来用SSH开发项目,遇到一个问题
在struts2接收上传文件的时候,发现所有接收的文件不对,后缀名还都是.tmp的,其实这个解决办法太简单。
文件确实都已经上传上来了。Struts2默认就是上传的文件是.temp格式的临时文件,只需要修改后缀名即可,但是他用的是layer这个插件。只需要简单改造,取得文件名即可,layer的文件上传js是这样的
layui.use('upload', function(){
var headimgFileName=""; //1.这里添加一个变量
var $ = layui.jquery
,upload = layui.upload;
//多文件列表示例
var demoListView = $('#demoList')
,uploadListIns = upload.render({
elem: '#testList'
,url: '../upload/upload.do'
,accept: 'file'
,multiple: true
,auto: false
,data:headimgFileName //2.这里追加一个data字段,传入文件名
,field : "headimg"
,bindAction: '#testListAction'
,choose: function(obj){
var files = this.files = obj.pushFile();
//读取本地文件
obj.preview(function(index, file, result){
headimgFileName= file.name; //3.这个是选择上传文件后,等待上传按钮触发的回调函数,在这里可以取到文件名,所以追加这行
var tr = $(['<tr id="upload-'+ index +'">'
,'<td id="fileName">'+ file.name +'</td>'
,'<td>'+ (file.size/1014).toFixed(1) +'kb</td>'
,'<td>等待上传</td>'
,'<td>'
,'<button class="layui-btn layui-btn-mini demo-reload layui-hide">重传</button>'
,'<button class="layui-btn layui-btn-mini layui-btn-danger demo-delete">删除</button>'
,'</td>'
,'</tr>'].join(''));
//单个重传
tr.find('.demo-reload').on('click', function(){
obj.upload(index, file);
});
//删除
tr.find('.demo-delete').on('click', function(){
delete files[index]; //删除对应的文件
tr.remove();
uploadListIns.config.elem.next()[0].value = ''; //清空 input file 值,以免删除后出现同名文件不可选
});
demoListView.append(tr);
});
}
,done: function(res, index, upload){
if(res.code == 0){ //上传成功
var tr = demoListView.find('tr#upload-'+ index)
,tds = tr.children();
tds.eq(2).html('<span style="color: #5FB878;">上传成功</span>');
tds.eq(3).html(''); //清空操作
return delete this.files[index]; //删除文件队列已经上传成功的文件
}
this.error(index, upload);
}
,error: function(index, upload){
var tr = demoListView.find('tr#upload-'+ index)
,tds = tr.children();
tds.eq(2).html('<span style="color: #FF5722;">上传失败</span>');
tds.eq(3).find('.demo-reload').removeClass('layui-hide'); //显示重传
}
});
});
1.定义一个变量用于存放文件名
2.请求时,追加额外的data字段,传入想传的数据
3.在pre回调中,赋值给定义的变量
通过这三步,已经可以接收到文件的名字了
接下来是服务器端
通过属性驱动,就自动获取到了文件的名字
用的是多文件上传
它会循环调用,服务器一次次接收到请求,并非将多个文件的文件名一次性发过来逗号隔开
所以服务器端保存文件,这么写即可,我用的UUID作为了文件的名字,FileUtils取后缀
String oldName=UUID.randomUUID().toString().replaceAll("-", "");
String suffix = FilenameUtils.getExtension(headimgFileName);
String newName=oldName+"."+suffix;
try {
FileUtils.copyFile(headimg, new File("D://upload/"+newName));
} catch (IOException e) {
e.printStackTrace();
System.out.println("服务器文件存储失败!");
}
这样即可
本人个人原创,如有雷同,纯属巧合,或者与本人联系,做改动。请转载或者CV组合标明出处,谢谢!(如有疑问或错误欢迎指出,本人QQ:752231513)