Java下载文件功能详解,方式通过传递文件名下载

本文介绍了一个基于Java和JavaScript的文件下载系统实现方案,重点在于如何检查文件的存在性及格式,确保用户能够顺利下载正确的文件内容。具体步骤包括前端通过AJAX异步请求检查文件存在性,后端通过HTTP响应头设置正确下载文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

展示页面

html页面

项目使用的是VM页面  $!promotion.enclosure  为文件名称。

<input type="button" id="toExecl" onclick="downxxxEnclosure('$!promotion.enclosure')"  value="下载内容">

js代码

需注意因为文件可能不存在 所以使用的是先用ajxa异步查询文件是否存在

function downxxxEnclosure(name){
    $.ajax({
        url:"/xxx/checkxxxEnclosure",
        data:{name:name},
        async:false,
        success:function(data){
            //检查文件格式和是否存在
            if(data){
                if (window.confirm("确认下载?")) {
                    location.href='/xxx/downxxxEnclosure?name='+name;
                }
            }else{
               alert("下载内容格式有问题或不存在!")
            }
        }
    });
}


关联ajax 

第一步执行

url:"/xxx/checkxxxEnclosure",
        data:{name:name},

file.exists()判断是否存在的文件或者文件夹如果有返回true

java代码 

/**检查下载附件是否存在*/
@RequestMapping("/checkxxxEnclosure")
public @ResponseBody Boolean checkxxxEnclosure(String name){
    try{
        File file = new File(path+name);
        if (file.exists()) { // 文件存在
            return true;
        }else {
            return false;
        }
    }catch (Exception e){
        log.error("",e);
    }
    return false;
}

此处path为文件存放的路径

使用的是配置文件的方式

 路径和文件内容拼接在一起 

第二步执行

if (window.confirm("确认下载?")) {
                    location.href='/xxx/downxxxEnclosure?name='+name;
                }

关联java代码

/**推广下载附件*/
@RequestMapping("/downxxxEnclosure")
public String downxxxEnclosure(String name,HttpServletResponse response){
    try{
        /* 第一步:根据文件路径获取文件 */
            File file = new File(path+name);
            if (file.exists()) { // 要通过file.exists()判断是否存在test命名的文件或者文件夹,如果返回true
            /* 第二步:根据已存在的文件,创建文件输入流 */
                InputStream inputStream = new BufferedInputStream(new FileInputStream(file));
            /* 第三步:创建缓冲区,大小为流的最大字符数 */
                byte[] buffer = new byte[inputStream.available()]; // int available() 返回值为流中尚未读取的字节的数量
            /* 第四步:从文件输入流读字节流到缓冲区 */
                inputStream.read(buffer);
            /* 第五步: 关闭输入流 */
                inputStream.close();
                String fileName = file.getName();// 获取文件名
                response.reset();
                response.addHeader("Content-Disposition",
                        "attachment;filename=" + new String(fileName.getBytes("utf-8"), "iso8859-1"));
                response.addHeader("Content-Length", "" + file.length());
            /* 第六步:创建文件输出流 */
                OutputStream outputStream = new BufferedOutputStream(response.getOutputStream());
                response.setContentType("application/octet-stream");
            /* 第七步:把缓冲区的内容写入文件输出流 */
                outputStream.write(buffer);
            /* 第八步:刷空输出流,并输出所有被缓存的字节 */
                outputStream.flush();
            /* 第九步:关闭输出流 */
                outputStream.close();
            }else {
                return redirect("/xxx/list");
            }
    }catch (Exception e){
        log.error("",e);
    }
    return redirect("/xxx/list");
}

 为了避免文件找不到问题,返回至特定页面

 else {
                return redirect("/xxx/list");
            }

java代码部分根据原帖http://blog.youkuaiyun.com/dreamstar613/article/details/55260481改进!




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值