【JAVA】Web中文件的上传与下载

前言

        Web程序中,文件的上传与下载很是常见,就比如CSDN插入图片的功能,就是典型的文件上传功能,接下来来看下这个功能是怎么实现的。

文件上传

        从前台开始,首先,JSP中要引用几个相关的js文件,如jquery.js和ajaxfileupload.js,引用完这两个基础的js之后,我们就可以开始写jsp的内容,jsp简单来说,主要的就是一个点:

<input type="file" name="file" id="ceshi" class="files_upload">浏览文件</input>
        其中,type=file就是定义了这是一个选择文件的窗口。Id唯一标识了一个文件域。

保存按钮:

<input id="upload" type="button" οnclick="upload()" value="保存"/>
保存按钮对应的upload方法:
function upload() {
    ajax_upload (null,' /upload.do','ceshi');//使用ajax上传文件
}
function ajax_upload(tsAlert, url, feid) { // 具体上传文件的方法
    $.ajaxFileUpload({
        fileElementId : feid, // 需要上传的文件域的ID,即<input type="file">的ID。
        url : url, // 后台方法的路径
        type : 'post', // 当要提交自定义参数时,这个参数要设置成post
        dataType : 'json', // 服务器返回的数据类型。可以为xml,script,json,html。如果不填写,jQuery会自动判断。
        secureuri : false, // 是否启用安全提交,默认为false。
        async : true, // 是否是异步
        success : function(data, status) { //参数data就是服务器返回的数据。
            //上传成功后执行的函数
        },
        error : function(data, status, e) {
            //上传失败后执行的函数
        }
    });
}
        前台需要的东西已经准备就绪,现在开始写url后台方法路径里的方法:
@RequestMapping("/upload")
@ResponseBody
public void upload(@RequestParam("file") CommonsMultipartFile file){
    try {
        if (null != file) {
            String filePath =”E:/ceshi”; // 文件上传路径
            String filename = file.getOriginalFilename();//获取文件名(带后缀)
            File realfFile = new File(filePath, filename);
            if (!realfFile.exists()) {
                if (!realfFile.getParentFile().exists()) {
                    realfFile.getParentFile().mkdirs();
                }
                realfFile.createNewFile();
            }
            FileUtils.copyInputStreamToFile(file.getInputStream(), realfFile);
        }
    } catch (Exception e) {}
    return file_;
}
        这段代码的大致意思就是将web端传过来的文件转换成流,然后在相应文件夹中创建相同名称的文件,再将文件流输入到文件中。

文件下载

        文件的下载也很常见,比如CSDN有使用积分下载文档啊,jar包啊之类的功能,那么这个功能又是怎么实现的呢。

        文件下载不需要前端,它的的大概意思就是将服务器文件转换成流推送到浏览器,然后浏览器有相应的下载功能。看代码:

@RequestMapping("/down")
public void down(HttpServletRequest request, HttpServletResponse response) {
    String filePath = “E:/ceshi” + “/” + “文件名.后缀”;
    byte[] tmpByte = fileToByte(filePath);
    File file = new File(“文件名.后缀”);//这里不需要加路径,这个文件最后会删除
    try {//把byte数组写入到一个文件中
        OutputStream ou = new FileOutputStream(file);
        ou.write(tmpByte);
        ou.close();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    //读取要下载的文件,保存到文件输入流
    FileInputStream in;
    //创建输出流
    OutputStream out;
    try {
        //设置响应头,控制浏览器下载该文件
        response.setHeader("content-disposition","attachment;filename="+ URLEncoder.encode(file.getName(), "UTF-8"));
        in = new FileInputStream(file.getAbsolutePath());
        //创建输出流
        out = response.getOutputStream();
        //创建缓冲区
        byte buffer[] = new byte[1024];
        int len = 0;
        //循环将输入流中的内容读取到缓冲区当中
        while ((len = in.read(buffer)) > 0) {
            //输出缓冲区的内容到浏览器,实现文件下载
            out.write(buffer, 0, len);
        }
        //关闭文件输入流
        in.close();
        //关闭输出流
        out.close();
        file.delete();//删除临时生成的文件
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}
//工具类,将File文件转换成流
private static byte[] fileToByte (String filePath)
{
    byte[] buffer = null;
    try
    {
        File file = new File(filePath);
        FileInputStream fis = new FileInputStream(file);
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        byte[] b = new byte[1024];
        int n;
        while ((n = fis.read(b)) != -1)
        {
            bos.write(b, 0, n);
        }
        fis.close();
        bos.close();
        buffer = bos.toByteArray();
    }
    catch (FileNotFoundException e)
    {
        e.printStackTrace();
    }  
    catch (IOException e)
    {
        e.printStackTrace();
    }  
    return buffer;
}
如果想下载的话,直接网页访问:

服务器地址:端口/down.do

即可。

总结

        文件上传与下载都是通过二进制流的形式进行的,这些在代码中也有体现。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 13
    评论
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值