文件上传/下载

文件上传与下载

1 上传流程

采用 smartupload.jar 实现文件上传

  1. 将jar包添加至项目lib下/或者添加依赖

  2. 上传的页面

<form action="toUpload" method="post" enctype="multipart/form-data" >
    书名:<input type="text" name="bookName"/><br>
    图片:<input type="file" name="自定义名称"/><br>
    <input type="submit" value="提交"/>
</form>

注:

  • form 表单必须使用post提交方式,因为get方式有大小限制
  • form表单必须添加属性:enctype=“multipart/form-data”,此属性设定表单编码类型
enctype 值描述
application/x-www-form-urlencoded在发送前编码所有字符(默认)
multipart/form-data不对字符编码。在使用包含文件上传控件的表单时必须使用该值。
text/plain空格转换为 “+” 加号,但不对特殊字符编码。
  1. 获取文件
  • 获取上传文件对象
  • 获取pageContext对象
  • 上传文件
  • 得到文件的基本信息
  • 将文件保存至指定的目录
// 获取上传文件对象 smartupload将请求封装了起来
        SmartUpload sud = new SmartUpload();
        // 获取pageContext对象
        PageContext pageContext = JspFactory.getDefaultFactory().getPageContext(this, request, response, null, false, 1024, true);
        // 初始化sud
        sud.initialize(pageContext);
        sud.setCharset("utf-8");
        // 上传文件
        try {
            sud.upload();
            // 获取上传文件的信息
            Files files = sud.getFiles();
            // 遍历文件得到每个文件的信息
            File file = files.getFile(0);
            String fileName = file.getFileName();
            String contentType = file.getContentType();
            System.out.println(request.getContextPath());
            String url = "upload/"+fileName;
            // 上传至指定的目录
            System.out.println(url); //upload/文件名
            file.saveAs(url,SmartUpload.SAVE_VIRTUAL);// 虚拟路径
            String username = sud.getRequest().getParameter("username");
            System.out.println(username);
        } catch (SmartUploadException e) {
            e.printStackTrace();
        }

注:

  • 表单中若有其他数据,不能直接通过request来获取,需要通过SmartUpload对象获取
  • 关于抽象方法:JspFactory.getDefaultFactory().getPageContext(this, request, response, null, false, 1024, true);
public abstract PageContext getPageContext(Servlet var1, ServletRequest
var2, ServletResponse var3, String var4, boolean var5, int var6, boolean var7)
参数含义
servlet请求的servlet,在servlet中传this即可
requestservlet上挂起的当前请求
responseservlet上挂起的当前响应
errorPageURL请求JSP的错误页面的URL,或null
needsSSession是否需要session
buffer以字节为单位的缓冲区大小
autoflush缓冲区应该在缓冲区溢出时自动刷新到输出流,还是抛出IOException
  • 常用方法
属性名称说明
public final void initialize(PageContext page)执行上传和下载的初始化操作,必须实现
public void upload()实现文件数据的上传,在初始化后执行
public int save(String pathName)将全部上传文件保存到指定目录下,并返回保存文件的个数
public void setAllowFilesList(String ExtList)指定允许上传的文件扩展名,接收一个扩展名列表
public void setDeniedFilesList(String list)指定禁止上传的文件名列表,扩展以逗号隔开
public void setMaxFileSize(long filesize)设定每个文件允许上传的最大长度
public void setTotalMaxFileSize(long total)设定允许上传文件的总长度

2 文件的下载

  • 获取下载文件的名称
  • 通古getRealPath获取所下载文件在服务器的真实路径
  • 设置响应头信息
    • content-type:mimer(通过ServletContext获取)
    • content-disposition:attachment;filename=filename(默认是内联形式)
  • 通过本地字节流将文件加载到内存,然后通过字节输出流输出到客户端
 // 先获取下载文件名
        String filename = request.getParameter("filename");
        // 找到 文件的服务器路径
        String realPath = request.getRealPath("upload/"+filename);
        System.out.println(realPath);
		//D:\JavaTest\out\artifacts\XZK_Demo1_war_exploded\upload\xzk.pdf
        // 获取所下载文件的类型
        String mimeType = request.getServletContext().getMimeType(filename);
        // 设置响应头
        response.setHeader("content-type",mimeType);
        response.setHeader("content-disposition","attachment;filename="+filename);
        // 通过字节输入流将本地文件加载到内存
        InputStream is = new FileInputStream(realPath);
        ServletOutputStream os = response.getOutputStream();
        byte[] b = new byte[1024];
        int len = 0;
        while ((len = is.read(b)) != -1) {
            os.write(b,0,len);
        }
        is.close();
        os.close();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值