java基础(三十):文件上传

1.文件上传步骤
2.上传的前台的注意点
3.上传的后台的注意点
4.上传存放位置的问题
5.文件上传监视
6.文件下载

 

1.文件上传步骤

           (1).提供表单允许用户通过表单选择文件上传

           (2).在servlet中将上传的文件保存在服务器的硬盘中

 

2.上传的前台的注意点

           <form action="${pageContext.request.contextPath}/uploadServlet" method="post" ectype="multipart/form-data">

 

           javascript如何实现多表单上传:

                      <div id="fdiv"></div>

                      <script type="text/javascript">

                                 function addone(){

                                            var fidv = document.getElementById("fdiv");

                                            fdiv.innerHTML+='<div><input type="file1"/><input type="button" value="删除" οnclick="delOne(this)"/><br></div>';

                                 }

                                 function delOne(obj){

                                            obj.parentNode.parentNode.removeChild(obj.parentNode);

                                 }

                      </script>

 

3.上传的后台的注意点

           (1).DiskFileItemFactory

                      public DiskFileItemFactory(int sizeThreshold,File repository)

                      public void setSizeThreshole(int sizeThreshole)//设定内存缓冲区大小

                      public void setRepository(File repository)//设置临时文件夹大小

           (2).ServletFileUpload

                      boolean isMultipartContent(HttpServletRequest req)//判断表单是不是multipart/form-data类型

                      setFileMaxSize(long fileMaxSize)//设置单个文件最大大小

                      setMaxSize(long maxSize)//设置上传文件总量的最大值

                      setHeaderEncoding(String encoding)//设置文件的编码格式

                      List parseRequest(HttpServletRequest req)//解析request对象,将表单的每一个输入项包装成filelist对象

                      setProgressListener(ProgressListener listener)//实时监听文件上传状态

           (3).FileItem

                      boolean isFormField()//判断FileItem是一个文件上传对象还是普通表单对象

                      如果是普通字段:

                                 String getFieldName()//获取普通对象名称

                                 String getString(String encoding)//获取表单对象的value

                      如果是文件上传对象:

                                 String getName()//获取上传文件的文件名

                                 InputStream getInputStream()//获取上传文件的输入流

                                 delete()//在关闭FileItem输入流之后,删除临时文件

 

4.上传存放位置的问题

           (1).upload文件夹和temp文件夹要放在WEB-INF下面防止上传入侵

           (2).文件名要保持唯一,可以使用UUID

           (3).为了保证一个目录下面不要文件过多,可以分目录。分目录的算法很多,此处介绍根据hash值分目录

           

           String filename = item.getName();

           String uuidName = UUID.randomUUID()+"_"+filename;

           String hashStr = Integer.toHexString(hash);

           char[] chs = hashStr.toCharArray();

           String path = this.getServletContext.getRealPath("upload");

           for(char c:chas){

                      path+="/"+c;

           }

           new File(path).mkdirs();

 

5.文件上传监视

           fileUpload.setProgressListener(

                      Long beginTime = System.currentTimeMillis();

                      new ProgressListener(){

                                 public void update(long bytesRead,long contentLength,int items){

                                            BigDecimal br = new BigDecimal(bytesRead).divide(new BigDecimal(1024),2,BigDecimal.Round_HALF_UP);//已读取多少kb

                                            BigDecimal cl = new BigDecimal(contentLength).divide(new BigDecimal(1024),2,BigDecimal.Round_HALF_UP);//总共有多少kb

                                            Long nowTime = System.currentTimeMillis();

                                            Long useTime = (nowTime-beginTime)/1000;//已经过了useTime 秒

                                 }

                      }

           );

           //根据已知信息可以知道很多信息,如上传速度,上传大致剩余时间,剩余多少kb,已完成百分之多少等

 

jsp:

           <form action="${pageContext.request.contextPath}/uploadServlet" method="post" ectype="multipart/form-data">

                      <input type="file" name="file1"/>

                      <input type="submit" value="上传"/>

           </form>

servlet:

           public class UploadServlet extends HttpServlet{

                      protected void doGet(HttpServletRequest req,HttpServletResponse resp) throws Exception{

                                 try{

                                            DiskFileItemFactory factory = new DiskFileItemFactory();

                                            ServletFileUpload fileUpload = new ServletFileUpload(factory);

                                            Map<String,List<FileItem>> map = fileUpload.parseParameterMap

                                 }catch(Exception e){

                                 

                                 }

                      }

           }           

 

6.文件下载

           法一:超链接指向下载资源

           法二:

                      response.setHeader("Content-Disposition","attachment,filename="+URLEncoder.encode(filename,"utf-8"));

                      response.setContentType(this.getServletContext.getMimeType(filename));

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鹏哥哥啊Aaaa

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值