javaweb文件上传与下载

文件传输的相关设置

  • form表单

提交方式: post

enctype属性的介绍:

Content-Type的类型扩充了multipart/form-data用以支持向服务器发送二进制数据。
因此发送post请求时候,表单<form>属性enctype共有二个值可选,
这个属性管理的是表单的MIME编码:

    1.application/x-www-form-urlencoded(默认值)
    2.multipart/form-data

enctype默认属性为:application/x- www-form-urlencoded

实例:

from表单:

<form action="/FileUpLoad/Aservlet" method="post"
        enctype="multipart/form-data">
        用户名:<input type="text" name="name"/><br>
        头像:   <input type="file" name="photo" /> <br>
        <input type="submit" value="上传"/>
    </form>

<img src="picture/form.png"/>

  • 上传工具类的使用

介绍:

通常两个包一起用
commons-fileupload-1.2.1.jar
commons-io-1.4.jar

在sevlet 中的使用:

@Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        DiskFileItemFactory factory = new DiskFileItemFactory();
        //设置临时上传目录 位置
        factory.setRepository(new File("E://temp"));
        //设置文件  写入 硬盘的缓冲区大小 =>   默认值   10k
        factory.setSizeThreshold(10240);

        //创建解析器 
        ServletFileUpload upload = new ServletFileUpload(factory);
        //判断但钱请求  是否是多端式请求
        upload.isMultipartContent(req);
        //设置多段 中每段   段头  在解析时,使用神马编码解码  ==
        //=> 当段头中出现中文时,一定要调用该方式指定段头码表
        upload.setHeaderEncoding("UTF-8");

        upload.setSizeMax(1024*1024*10);   //单次请求,总的上传限制
        upload.setFileSizeMax(1024*1024);  //每个文件的上传段,大小限制

        try {
            fileItems = upload.parseRequest(req);
            if(fileItems!=null){
                for (FileItem item : fileItems) {
                    //是否为普通表单提交
                    boolean flag = item.isFormField();
                    //获取上传文件的      文件名
                    String name = item.getName();
                    //获取input 元素  name属性的值
                    String fName = item.getFieldName();
                    //已字符串  形式 返回 段体中的内容,注意:文件上传不建议使用该方法
                //  String content = item.getString();
                    //删除上传的临时文件
                    item.delete();
                    System.out.println("是否是普通表单提交"+flag);
                }
            }
        } catch (FileUploadException e) {
            e.printStackTrace();
        }

    }

如何将上传文件分目录保存

1.使用登录用户的用户名 来创建不同的文件夹. 每个用户上传的文件就放到自己的文件夹中

2.按照日期分目录=> d:/upload/2015/08/24/
 InputStream is = item.getInputStream();
         SimpleDateFormat sdf = new SimpleDateFormat("/yyyy/MM/dd/");
         String datePath = sdf.format(new Date());
         String wholePath = "E:/upload"+datePath;

         File dir = new File(wholePath);
         if(!dir.exists()){
             dir.mkdirs();
         }

         FileOutputStream fos = new FileOutputStream(wholePath+UUID.randomUUID().toString());
         IOUtils.copy(is, fos);
         fos.close();

乱码问题的解决

文件名称乱码 :      
Content-Disposition: form-data; name="name" 分段首行 乱码更正
upload.setHeaderEncoding("UTF-8");

文件内容乱码:
item.getString("UTF-8")

解释:

<img src="picture/uploadmessycode.png"/>

文件下载

  • 路径问题

    这里写图片描述

  • 乱码问题

1.得到表单中的内容有中文(get)

String fileName = req.getParameter("name");
        fileName = new String(fileName.getBytes("ISO-8859-1"),"UTF-8");

2.下载的文件名称有中文

resp.setHeader("Content-Disposition", "attachment;filename="+URLEncoder.encode(fileName, "UTF-8")); 
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值