文件上传和下载

文件上传

本质

        本质:I/O的读写
                客户端(浏览器) 发送文件  Http协议     通过协议 将文件内容写过去  - - - 网络输入流
                服务器(Web容器) 接收文件  协议    文件内容读进来  - - -  网络输入流  本地输出流 

使用别人写好的包进行文件上传

        常用的是一个apache提供的一个包 (一些框架也有 但其底层也是基于apache的这个包)

        commons-fileupload.jar
        commons-io.jar
        去官网下载 www.apache.org
 

上传步骤

        浏览器端
                        1.写一个JSP/HTML 做展示 (选择文件 )
                        2.必须通过表单提交 
                        3.必须使用post方式 
                                规定:ServletFileUpload 类中的一个属性post规定        

                                字节数:   get请求没有限制,肯定通过URL拼接
                                                每一个浏览器对应URL的处理长度有所不同
                                                IE 2048+35     IE 4076
                                                Google    8182
                                                FireFox   65535
                                                Safari      80000
                                                Opera     190000
                                        Post没有限制 需要Web容器支持 也可以修改长度 在Tomcat的配置文件里  server.xml   <Connector port="8080"  maxPostSize="-1" >  -1或0即不做限制

                        4.以前的表单 只有两个属性 action  method
                                如果想要文件上传 表单必须再添加一个属性 
                                enctype="multipart/form-data" 
                                指定表单数据的编码类型为 multipart/form-data,以便支持文件上传

                        5.必须使用 <input type="file"  > 通过这个组件让用户选择上传的文件
                                不仅仅能得到文件名 还能将文件内容读出来  

        服务器端

                1.引入文件上传所需要的jar包 
                        commons-fileupload.jar
                        commons-io.jar

                2.   ·  使用一个DiskFileItemFactory对象创建工厂
                        DiskFileItemFactory factory = new DiskFileItemFactory();
                       ·  使用一个ServletFileUpload对象   包含一个factory
                        ServletFileUpload upload = new ServletFileUpload(factory);
                      ·   使用upload对象解析request   得到一个List<FileItem>
                        List<FileItem> itemList = upload.parseRequest(request);
            3.自己的业务逻辑
                通过遍历集合可以获取每一个item元素
                FileItem item 元素可能是一个普通组件   可能是一个文件
                item.isFormField();方法可以判断是否是一个普通文件
                如果item是一个普通的组件
                    注意:不能用原生的方式获取参数request.getParameter();
                    使用如下方式获取
                    String = item.getFieldName();获取组件的name属性
                    String = item.getString();获取组件的value属性
                    注意:不能使用原生的方式处理中文request.setCharacterEncoding();
                    使用如下方式处理

                如果判断后 item是一个文件 
                        读取文件的内容  
                        item.getInputStream() 获取网络输入流
                        item.write(File file)   写入文件 临时空间默认tomcat-temp 可能会内存溢出
                        item.getName()         获取文件名字

                如果上传的文件过大 
                        产生临时文件 为了防止丢包
                        默认情况下在Tomcat的temp文件夹中
                        factory.setSizeThreshold();// 设置缓冲区的大小  默认10240
                        factory.setRepository(File file); 可以用工厂设置临时缓冲区的地址
                        还可以设置上传文件本身的大小 

                        upload.setFileSizeMax(); 上传文件的大小
                        upload.setSizeMax();    上传文件的总大小    

                如何获取根目录

                       req.getSession().getServletContext().getRealPath("/")
                        或    String path = this.getServletContext().getRealPath("/");   根目录下


                如果文件上传出现文件名冲突 ?        

                        原来名字+用户+时间.原来后缀                       
                        用一个随机产生的名字当作保存在服务器中的文件名字
                控制文件上传类型 防止病毒文件
                        input属性设置   --  accept=".txt,.pdf,.doc,.docx"
                        或
                        java后台获取文件名 比对 判断 是否符合标准 进行过滤
                 

               

文件下载

        浏览器端

                发送请求的按钮  <a href="download?filename=xxx" > </a>

        服务器端 

                 1.接受需要下载的文件名
            2.找到文件并创建输入流读取内容
            3.处理一下响应时的中文字符
            4.设置响应内容类型和状态
            5.response创建输出流将内容响应回浏览器
            

        

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值