基于Java的文件上传与下载

最近自己做了一个关于文件上传与下载的小demo,在制作中遇到了一些小问题,特在此记录一下。

一、文件上传

1.前台及对应后台代码:

<input name="upSource" type="file"/>
        private PrintWriter out = hresponse.getWriter();
    	//判断文件是否存在(upSource为前台传入的文件)
    	if(upSource!=null&&upSource.length()>0){
    		//判断传入的数据格式是否与选择的格式相同
    		String str=getThisType();//此为前台填写的文件格式类型,读者可去掉,另外此处的格式的值是通过struts的属性匹配获得的
    		String type=str.substring(str.lastIndexOf(".") + 1, str.length());//获取文件后缀
    	    //将格式转为小写后与传入的格式进行比较
    	    if(!model.getUform().toLowerCase().equals(type)){
    	    	out.print("<script language='javascript'>alert('传入的文件与选择的文件格式不否!'); history.back(0);</script>");
    		out.flush();
    		out.close();
    		return null;
    	    }
    	    String path = hrequest.getSession().getServletContext().getRealPath("/upload");//获取服务器文件的上传路径
    	    path=path+"\\"+model.getUname()+"."+model.getUform().toLowerCase();//将文件名及后缀与路径进行拼接(此处model为struts的模型匹配)
    	    try {
    	    	    FileInputStream  fin = new FileInputStream(upSource);//创建文件输入流对象			    	           
        	    FileOutputStream  fout =  new FileOutputStream(path);//创建文件输出流对象(注意见标题三)
        	    int size= (int) upSource.length();
    	            byte [] buffer = new byte [size];
    		    while (fin.read(buffer) != -1 ) {
    		        fout.write(buffer);
                    } 
    		    fout.flush();
    		    fout.close();
    		    fout = null;
    		    fin.close();
    		    fin = null;
            	    out.print("<script language='javascript'>alert('上传成功!'); history.back(0);</script>");
        	    out.flush();
        	    out.close();
        	    return null;
		} catch (Exception e) {
		     out.print("<script language='javascript'>alert('上传失败,请重新上传!'); history.back(0);</script>");
        	     out.flush();
        	     out.close();
        	     return null;
		}
    	}else{
    		out.print("<script language='javascript'>alert('您所选的文件不存在!'); history.back(0);</script>");
		out.flush();
		out.close();
		return null;
    	}

2.效果图如下:


二、文件下载:

1.后台代码

    	String uform=hrequest.getParameter("uname").
    	substring(hrequest.getParameter("uname").indexOf(".")+1, hrequest.getParameter("uname").length());
    	String uname=hrequest.getParameter("uname").substring(0,hrequest.getParameter("uname").indexOf("."));
    	String path = hrequest.getSession().getServletContext().getRealPath("/upload");//获取服务器资源存放文件
    	String fileName=path+"\\"+hrequest.getParameter("uname").toLowerCase();//获取所要下载文件的完整路径
	File file=new File(fileName);//获取指定文件
	if(!file.exists()){//判断文件是否存在
	   out = hresponse.getWriter();
	   out.print("<script language='javascript'>alert('文件不存在!'); history.back(-1);</script>");
	   out.flush();
	   out.close();
	   return null;
	}
	else{
	   FileInputStream from=null;
	   ServletOutputStream oupstream=null;
	   from = new FileInputStream(file);//获取指定文件的输入流
	   /* 设置文件ContentType类型,这样设置,会自动判断下载文件类型 */
	   hresponse.setContentType("multipart/form-data");
	   hresponse.setContentType("application;charset=utf-8"); // 指定文件的保存类型。
	   //解决乱码问题
	   hresponse.setHeader("Content-disposition", "attachment; filename=" + java.net.URLEncoder.encode(file.getName(), "UTF-8"));
	   fileName=file.getName();
	   try {
		oupstream = hresponse.getOutputStream();//此处需要注意,见标题三
		int size=(int) file.length();
		byte[] buffer = new byte[size];
		int bytes_read;
		while ((bytes_read = from.read(buffer)) != -1) {
		    oupstream.write(buffer, 0, bytes_read);
		}
		oupstream.flush();
	        oupstream.close();
		//存储下载信息
	    } catch (Exception e) {
		out = hresponse.getWriter();
		out.print("<script language='javascript'>alert('下载失败!'); history.back(-1);</script>");
		out.flush();
		out.close();
		return null;
	    }finally{ 
	        if(from != null){ 
		from.close(); 
		} 
		if(oupstream != null){ 
		 oupstream=null; 
		} 
	    } 
			
	  return null;
        }

2.效果图如下:

  • 下载列表


  • 下载效果


扫描二维码关注公众号,回复: 177721 查看本文章

三、需要注意的几点:

1.<input type="file">标签不能正确将文件的路径和名字传入后台

前台页面中加入<input type="file">标签后需要在form表单中加入Enctype属性(Enctype是指定将数据回发到服务器时浏览器使用的编码类型,其编码类型有三种)。

Enctype三种参数:

  • application/x-www-form-urlencoded: 在发送前编码所有字符(默认)。这是标准的编码格式。 
  • multipart/form-data: 不对字符编码,在使用包含文件上传控件的表单时,必须使用该值。 
  • text/plain: 窗体数据以纯文本形式进行编码,其中不含任何控件或格式字符。 
 <form action="${ctx}/upload!upLoadSources.action" method="post" enctype="multipart/form-data" > 

2.文件上传中需要注意的俩个点

  • 输出流中构造传入的路径必须包含路径及文件完整的名称和后缀,这样输出了才能精准的将数据写到指定位置,否则会报错。
  • 在上传文件中,如果文件路径中或文件名中包含中文,为了防止乱码导致找不到路径的问题,我们需要通过如下代码对这个完整路径进行处理。
path=new String(path.getBytes("iso-8859-1")."utf-8"));
3.resopnse中的getOutputStream()方法和getWriter()方法是互斥的,使用其中一个就不能使用另一个,所以如果非要使用getWriter()时必须将其写在与getOutputStream()互斥的模块中,比如一个写在try中,另一个则写在catch中。






猜你喜欢

转载自blog.csdn.net/goodli199309/article/details/79739824