欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

java实现文件上传,下载和删除的demo

程序员文章站 2022-06-18 17:46:55
...

因为近期一个项目要用到文件的上传,下载和删除,在网上看了些例子,自己也参照原代码的例子写了个demo,废话不说请看效果图:
java实现文件上传,下载和删除的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>&nbsp;&nbsp;
            <a class="mini-button" iconCls="icon-remove" style="background:#306BBD; color:#ffffff; margin-left:5px" onclick="mkh_delete()">删除</a>&nbsp;&nbsp;
        </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) {
}
相关标签: 文件下载 上传