Web上传下载文件

基本配置

  1. jar
    commons-fileupload组件
    commons-io

  2. 文件编写

jsp

<!-- 
	若有 input type="file",则 method 必须是 post, 
	且必须设置 enctype="multipart/form-data"
-->
<form action="upload" class="myStyle" method="post" enctype="multipart/form-data">
    学号:<input name="sno" type="text" class="myStyle"><br/>
    姓名:<input name="sname" type="text" class="myStyle"><br/>
    上传照片:<input type="file" name="spicture"><br/>
    <input class="myStyle" type="submit" value="注册">
</form>

servlet:

boolean isMultipart = ServletFileUpload.isMultipartContent(request);
//判断前台的form是否有multipart属性
if(isMultipart){
    DiskFileItemFactory fileItemFactory = new DiskFileItemFactory();
    ServletFileUpload upload = new ServletFileUpload(fileItemFactory);
    try {
        //设置上传文件时用到的临时文件的大小DiskFileItemFactory
        fileItemFactory.setSizeThreshold(10240);
        fileItemFactory.setRepository(new File(request.getSession().getServletContext().getRealPath("Upload")));

        Thread.sleep(3000);
        //控制上传单个文件的大小
        upload.setSizeMax(20480);

        /*
            1. 通过parseRequest解析form中的所有请求字段,并保存到items集合中
               即前台传递的sno sname spicture此时就保存在items中
            2. 用迭代器Iterator<FileItem>遍历
            3. 上述各种设置限制设置需要在此方法前
         */
        List<FileItem> items = upload.parseRequest(request);

        Iterator<FileItem> iterator = items.iterator();
        while (iterator.hasNext()){
            FileItem item = iterator.next();
            String itemName = item.getFieldName();
            int sno = -1;
            String sname = null;
            /*
                判断前台字段是普通form表单字段(sno sname),还是文件字段
                由于enctype="multipart/form-data"字段,不可用request.getParameter()
             */
            if(item.isFormField()){
                if(itemName.equals("sno")){
                    sno = Integer.parseInt(item.getString("UTF-8"));
                }else{
                    sname = item.getString("UTF-8");
                }
            }
            else {
                /*
                    文件上传
                    getFieldName()是获取普通表单字段的Name值
                    getName()是获取文件名
                 */
                String fileName = item.getName();

                //控制格式
                String ext = fileName.substring(fileName.indexOf(".")+1);
                if(!(ext.equals("png")||ext.equals("jpg")||ext.equals("gif"))){
                    System.out.println("图片类型有误!格式只能是png gif jpg");
                    return;
                }

                //设置上传文件时用到的临时文件的大小DiskFileItemFactory
                fileItemFactory.setSizeThreshold(10240);
                fileItemFactory.setRepository(new File(request.getSession().getServletContext().getRealPath("Upload")));

                Thread.sleep(3000);
                //控制上传单个文件的大小
                upload.setSizeMax(20480);


                /*
                    获取文件内容并上传
                    定义文件路径:制定上传的位置(服务器路径)
                    获取服务器路径
                    最好还是保存于别的虚拟路径,否则项目重启之前的文件会不见
                 */
                String path = request.getSession().getServletContext().getRealPath("Upload");
                File file = new File(path,fileName);

                try {
                    //将该文件写入到上传位置,文件名为fileName
                    item.write(file);
                } catch (Exception e) {
                    e.printStackTrace();
                }
                System.out.println(fileName+"上传成功!");
                return;
            }
        }

    } catch (FileUploadException | InterruptedException e) {
        e.printStackTrace();
    }
}

下载

  1. jar 不需要
  2. 步骤
    a. 请求(地址a form),请求Servlet
    b. Servlet通过文件的地址 将文件转为输入流 读到Servlet中
    c. 通过输出流 将刚才已经转为输入流的文件 输出给用户
String fileName = request.getParameter("fileName");
//下载文件:需要设置消息头
response.addHeader("content-Type","application/octet-stream");//MIME类型:二进制文件(任意文件)
//fileName包含文件后缀,下载的编码格式

String agent = request.getHeader("User-Agent");


response.addHeader("content-Disposition","attachment;filename="+ URLEncoder.encode(fileName,"UTF-8"));
/*
    其中火狐浏览器比较特殊:
    if(agent.toLowerCase().contains("firefox"))
        response.addHeader("content-Disposition","attachment;filename=?UTF-8?B?"+new String(Base64.encodeBase64(fileName.getBytes(StandardCharsets.UTF_8)))+"?=" );

 */

//Servlet通过文件的地址 将文件转为输入流 读到Servlet中
InputStream in = getServletContext().getResourceAsStream("/Upload/"+fileName);

//通过输出流 将 刚才已经转为输入流的文件 输出给用户
ServletOutputStream out = response.getOutputStream();

byte[] bs = new byte[10];
int len = -1;
while ((len=in.read(bs))!= -1){
    out.write(bs,0,len);
}
out.close();
in.close();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值