java实现文件上传,下载和删除的demo
程序员文章站
2022-06-18 17:46:55
...
因为近期一个项目要用到文件的上传,下载和删除,在网上看了些例子,自己也参照原代码的例子写了个demo,废话不说请看效果图:
下面直接看代码:
前端:前端使用的miniUI,如果你们的不是也无所谓,主要就是按钮的触发事件。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script type="text/javascript" src="../../../js/miniui/boot.js"></script>
<script type="text/javascript" src="../../../platform/miniui/js/platformload.js"></script>
<link rel="stylesheet" href="../../../js/miniui/miniui/themes/gray/skin.css" />
<link rel="stylesheet" href="../../css/simple.skin.css" />
<script src="js/uploadfile.js"></script>
</head>
<style type="text/css">
html,body
{
width:100%;
height:100%;
border:0;
margin:0;
padding:0;
overflow:visible;
}
</style
<body>
<div class="mini-fit">
<div style="padding: 10px" id="buuton">
<div>
<a class="mini-button" iconCls="icon-upload" style="background:#306BBD; color:#ffffff; margin-left:5px" onclick="mkh_upload()">上传</a>
<a class="mini-button" iconCls="icon-download" style="background:#306BBD; color:#ffffff; margin-left:5px" onclick="mkh_download()">下载</a>
<a class="mini-button" iconCls="icon-remove" style="background:#306BBD; color:#ffffff; margin-left:5px" onclick="mkh_delete()">删除</a>
</div>
<div class="tipsDiv" style="float: right;font-size: 14px;color: red;">
</div>
</div>
<div class="mini-fit">
<div id="grid" class="mini-datagrid" style="width:100%;height: 100%;" allowCellSelect="true" multiSelect="true"
editNextOnEnterKey="true" editNextRowCell="true" sizeList="[10,20,50,100]" pageSize="20">
<div property="columns">
<div type="indexcolumn" align="center" headerAlign="center">序号</div>
<div type="checkcolumn"></div>
<div field="num" visible="false" >附件序号</div>
<div field="NAME" align="center" headerAlign="center">文件名</div>
<div field="GMT_MODIFY" align="center" headerAlign="center" dateFormat="yyyy-MM-dd HH:mm:ss">上传时间</div>
</div>
</div>
</div>
</div>
</div>
</body>
</html>
js代码:我这里的js代码主要是通过ajax向后台发送请求。
var grid;
var file; // 定义一个全局变量,为一个文本选择器。
var tempmonth;
var year;
var type;
$(function(){
mini.parse();
grid = mini.get("grid");
});
//对应上个页面的mini.open中的SetData() 函数,本页面的SetData()会自动执行,无需主动调用
function SetData(data) {
year = data.year;
tempmonth = data.month;
type=data.type;
loadGridData();
}
//初始化
function loadGridData() {
$.ajax({
type: 'post',
url: 'data/upload_list.jsp',
data: {year: year, month: tempmonth, type : type},
dataType: 'json',
success: function (result) {
grid.setData(result.data.mkhlb_list);
}
});
}
//下载
function mkh_download() {
//得到选中行
var rows = grid.getSelecteds();
if(rows.length == 1){
var num = rows[0].ID_;
var url="data/upload_download.jsp?num="+num;
window.open(url,"_system");
}else{
_showTips("请选择一条记录","warning");
}
}
//删除
function mkh_delete() {
//得到主键
var rows = grid.getSelecteds();
if(rows.length > 0){
mini.confirm("确定删除记录?", "删除?",
function (action) {
if (action == "ok") {
var ids= new Array();
for(var i=0;i<rows.length;i++){
ids[i] = rows[i].ID_;
}
var params = {"nums":ids};
$.ajax({
type: 'post',
url: 'data/upload_delete.jsp',
data: params,
traditional: true,
dataType: 'json',
success: function (result) {
},
error:function (result) {
if(result.status==200){
mini.showMessageBox({
title: "提示",
iconCls: "mini-messagebox-question",
message:"删除成功"
});
}else {
mini.showMessageBox({
title: "提示",
iconCls: "mini-messagebox-question",
message:"删除失败"
});
}
loadGridData();
}
});
}
}
);
}else{
_showTips("请选择一条记录","warning");
}
}
//上传
function mkh_upload() {
// 这样file就是jquery创建的一个文本选择器,但是因为我们并没有把它加载到页面山,所以是不可见的。
file = $('<input type="file"/>');
// 启动文件选择
file.click();
// 选择好文件后,获取选择的内容
file.change(function(e){
//得到选择的文件
var select_file = file[0].files[0];
//得到文件名
var filename=select_file.name;
var reader = new FileReader();
//把文件读取成base64编码放到后台
reader.readAsDataURL(select_file);
reader.onload = function() {
var res;
//自定义表单
var fd = new FormData();
//得到base64编码
var data = reader.result.split(",")[1];
//把得到的参数放到表单中存到后台,因为如果不放入表单中会出现较大的文件传输不了的问题。
fd.append("year",year);
fd.append("month",tempmonth);
fd.append("filename",filename);
fd.append("data",data);
fd.append("type",type);
//发送请求
res=$.ajax({
type: 'post',
url: 'data/uploadfile.jsp',
data:fd,
dataType: "json",
//这里这三个一定要这样配置,否则前台报错
cache: false, // 不缓存数据
processData: false, // 不处理数据
contentType: false, // 不设置内容类型
success: function (textdata) {
//删除文件选择器,如果删除会出现第一次上传一次,第二次上传两次的情况
file.remove();
},
error:function (textdata) {
if(textdata.status==200){
mini.showMessageBox({
title: "提示",
iconCls: "mini-messagebox-question",
message:"文件上传成功"
});
}else {
mini.showMessageBox({
title: "提示",
iconCls: "mini-messagebox-question",
message:"文件上传失败"
});
}
file.remove();
loadGridData();
}
});
}
});
}
然后是后台代码,因为我这个*项目的所有后台代码都是存储在jsp中,但是都是java代码,所有应该没有关系的。
上传
String res=null;
try {
request.setCharacterEncoding("utf-8");
response.setContentType("application/json;charset=UTF-8");
YwqkService ywqkService = new YwqkService();
//核心方法,得到前台传入的值
Map<String, String> params = this.upload(request,response);
System.out.println("****"+params);
String filename= params.get("filename");
System.out.println("*******"+filename);
String data=params.get("data");
System.out.println("*******"+data);
String year=params.get("year");
System.out.println("*******"+year);
String month=params.get("month");
System.out.println("*******"+month);
String type=params.get("type");
System.out.println("*******"+type);
if(type.equals("1")){
type="MKHLB";
}else if(type.equals("2")){
type="YWJSC";
}else if(type.equals("3")){
type="LBQ_YWJSC";
}
//把前台得到的base64编码转换为字节码存入数据库的blob的列中
byte[] filebytes=org.apache.commons.codec.binary.Base64.decodeBase64(data);
//存储数据
res=ywqkService.uploadFile_Mkhlb(year,month,filename,filebytes,type);
}catch (Exception e){
e.printStackTrace();
res = e.getMessage();
}
上传的核心方法:
/**
* 使用原生的代码进行开发
* @param resp
* @throws ServletException
* @throws IOException
* @throws FileUploadException
*/
public HashMap<String, String> upload(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException, FileUploadException
{
boolean isMultipart = ServletFileUpload.isMultipartContent(req);
HashMap<String,String> resultMap=new HashMap<String,String>();
if (isMultipart) {
DiskFileItemFactory factory = new DiskFileItemFactory(1024 * 1024 * 100, null);
ServletFileUpload upload = new ServletFileUpload(factory);
upload.setHeaderEncoding("UTF-8");
upload.setSizeMax(1024 * 1024 * 100);
List<FileItem> fileItems = upload.parseRequest(new ServletRequestContext(req));
Iterator<FileItem> iter = fileItems.iterator();
while (iter.hasNext()) {
FileItem item = (FileItem) iter.next();
if (item.isFormField()) {
String name = item.getFieldName();
String value = item.getString("UTF-8");
resultMap.put(name, value);
} else {
byte[] filebytes = item.get();
if (StringUtils.isBlank(item.getName())) {
continue;
}
//使用BASE64解析编码
resultMap.put(item.getFieldName(),org.apache.commons.codec.binary.Base64.encodeBase64String(filebytes));
}
}
}
return resultMap;
}
然后得到字节码把数据存入到数据库中就可以了。
下载
下载就是从前台向后台传输选中的行的主键,然后后台通过主键查询数据库,然后得到流文件,下载就可以了。
try {
request.setCharacterEncoding("utf-8");
response.setContentType("application/json;charset=UTF-8");
YwqkService ywqkService = new YwqkService();
//得到前台传输过来的主键值
String ID_ = request.getParameter("num");
//通过主键值查询数据库得到结果集
Map<String, Object> resultMap =ywqkService.getMkhlbByte(response,ID_);
String name=resultMap.get("name").toString();
//得到数据库的流文件
InputStream is= (InputStream) resultMap.get("is");
response.reset();
//设置文件头
response.addHeader("Content-Disposition", "attachment;filename=" +new String(name.getBytes("gbk"),"iso8859-1"));
response.setContentType("application/octet-stream");
int len = 0;
//创建数据缓冲区
byte[] buffer = new byte[1024*100];
//通过response对象获取outputStream流
OutputStream os = response.getOutputStream();
//将FileInputStream流写入到buffer缓冲区
while((len = is.read(buffer)) > 0) {
//使用OutputStream将缓冲区的数据输出到浏览器
os.write(buffer,0,len);
}
is.close();
os.flush();
os.close();
} catch (Exception e) {
e.printStackTrace();
}
删除
删除和下载差不多就是拿到要删除的主键值,然后后台删除就可了。
JSONObject json = new JSONObject();
Integer flag=0;
try {
request.setCharacterEncoding("utf-8");
response.setContentType("application/json;charset=UTF-8");
YwqkService ywqkService = new YwqkService();
String[] s = request.getParameterValues("nums");
System.out.println("****"+s.toString());
for (int i=0;i<s.length;i++){
System.out.println("****"+s[0].toString());
flag=ywqkService.deleteMkhlb(s[i].toString());
}
} catch (Exception e) {
}