zoukankan      html  css  js  c++  java
  • 文件上传问题汇总

    网页文件上传

      网页中要求做一个文件上传,一脸蒙逼的我准备把遇到的问题记录下来,由于我是网页设计中小白中的小白,所以可以说是处处都是坑。

    1.HTML需要做的事

      实现文件上传最基本也是最原始的方法便是用form表单提交,需要的只是指定一下提交数据的编码格式。

    <form method="post" action="submitEntrust" enctype="multipart/form-data">
    

          默认情况下,enctype的值是application/x-www-form-urlencoded,不能用于文件上传;只有使用了multipart/form-data,才能完整的传递文件数据。

      另外可以一个输入框中选择多个文件进行上传,这需要设置 multiple属性。

    <input type="file" name="1" multiple="multiple">
    

      

    2.servlet需要做的事

      利用commons-fileupload组件简化文件上传,需要在lib目录下放入两个jar文件。

      

    public class FileUpload extends HttpServlet {
    		//用于存放上传文件的目录
    		private String uploadPath = "D:\addnetFile\"; 
    		//用于存放临时文件的目录
    		private File tempPath =new File("C:\windows\temp\"); 
    		 /**
    		  * 初始化Servlet,确保需要使用的目录都被建立. <br>
    		  * @throws ServletException if an error occure
    		  */
    		 public void init() throws ServletException {
    		 	if(!new File(uploadPath).isDirectory())
    		 		new File(uploadPath).mkdir();
    		 	if(!tempPath.isDirectory()){
    		 		tempPath.mkdir();
    		 	}
    		 }
    		/**
    		  * 销毁servlet. <br>
    		  */
    		 public void destroy() {
    		 	super.destroy();
    		 	}
    	 /**
    	  * servlet的doPost方法. <br>
    	  *
    	  *下面的注释是方法参数的信息.
    	  *
    	  * @param request the request send by the client to the server
    	  * @param response the response send by the server to the client
    	  * @throws ServletException if an error occurred
    	  * @throws IOException if an error occurred
    	  */
    	  public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException{
    	  	res.setContentType("text/html; charset=GB2312");
    	  	PrintWriter out=res.getWriter();
    	  	System.out.println(req.getContentLength());
    	  	System.out.println(req.getContentType());
    	   
    	  	DiskFileItemFactory factory = new DiskFileItemFactory();
    	  	// 缓存数据的大小
    	  	factory.setSizeThreshold(4096);
    	  	// 临时文件保存的位置
    	   factory.setRepository(tempPath);
    	   
    	   ServletFileUpload upload = new ServletFileUpload(factory);
    	   //可以上传的文件的最大字节数,如果文件太大会抛出异常
    	   upload.setSizeMax(1000000);
    	   	List fileItems = null;
    		try {
    			//开始读取上传信息
    			fileItems = upload.parseRequest(req);
    			//依次处理每个上传的文件
    			Iterator iter = fileItems.iterator();
    			// 正则匹配,过滤路径取文件名
    			String regExp=".+\\(.+)$";
    			//过滤掉的文件类型
    			String[] errorType={".exe",".com",".cgi",".asp"};
    			Pattern p = Pattern.compile(regExp);
    			while (iter.hasNext()) {
    				FileItem item = (FileItem)iter.next();
    				//忽略其他不是文件域的所有表单信息
    				if (!item.isFormField()) {
    					String name = item.getName();
    					long size = item.getSize();
    					if((name==null||name.equals("")) && size==0)
    	                 continue;
    					Matcher m = p.matcher(name);
    					boolean result = m.find();
    					//如果是允许上传的文件类型,就进行上传操作
    					if (result){
    						for (int temp=0;temp<errorType.length;temp++){
    							if (m.group(1).endsWith(errorType[temp])){
    								throw new IOException(name+": wrong type");
    								}
    							}
    						try{
    							//保存上传的文件到指定的目录
    							//在下文中上传文件至数据库时,将对这里改写
    							item.write(new File(uploadPath,m.group(1)));
    							out.print(name+"  "+size+"<br>");
    							}catch(Exception e){
    								out.println("333"+e);
    								}
    							}
    	               else
    	               {
    	                 throw new IOException("fail to upload");
    	               }
    	               }
    	           }
    	        }catch (IOException e){
    	           out.println("222"+e);
    	         }catch (FileUploadException e1) {
    				e1.printStackTrace();
    				out.println("111"+e1);
    			}
    	    }
    }
    

      

      其中java的目录创建需要利用mkdir()和mkdirs(),l两者区别是前者只能创建一级目录,比如在文件夹a下创建文件夹b;后者可以一次性创建多级目录,如在文件夹a下创建文件夹b,在文件夹b下创建文件夹c.

        File file = new File("路径");//此时file在内存中
        File dir = file.getParentFile();   //获取file上级目录
        if(!dir.exists())   //上级目录不存在
            dir.mkdirs();    //创建多级写入外存
    			
    		
    		
    

      

  • 相关阅读:
    二分排序之三行代码
    最短路径—Floyd算法
    最小生成树 Kruskal算法
    最小生成树-Prim算法
    最短路径之迪杰斯特拉(Dijkstra)算法
    C函数指针
    Linux进程的实际用户ID和有效用户ID
    C++ 之Boost 实用工具类及简单使用
    ELK之消息队列选择redis_kafka_rabbitmq
    Python文件操作
  • 原文地址:https://www.cnblogs.com/qwer112/p/6812108.html
Copyright © 2011-2022 走看看