zoukankan      html  css  js  c++  java
  • (八)利用apache组件进行文件上传下载

    一、文件上传

    • 文件上传,即服务器端得到并处理用户上传的文件,这个文件存放在request里,也就是需要对request进行处理。

      1.1  编写html文件

    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
        <form action="servlet/upload" method="post" enctype= "multipart/form-data">    
            文件描述:<input type="text" name="desc" /><br/>
            <input type="file" name="file" /><br/>
            <input type="submit" value="上传" />
        </form>
    </body>
    </html>
    

     解析:enctype= "multipart/form-data" 是实现文件上传必不可缺少的属性,但是加了此属性之后,就不能以 request.getParameter(arg0); 来获取表单值,只能通过getFieldName()获取表单名,getString()获取表单值。

      1.2  编写servlet

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		request.setCharacterEncoding("UTF-8");
    		fileUpload(request);
    		
    	}
      /*
      *文件上传
      */
    public void fileUpload(HttpServletRequest request) {                     //磁盘文件工厂类DiskFileItemFactory主要是设置临时文件目录 DiskFileItemFactory diff=new DiskFileItemFactory(); diff.setSizeThreshold(10*1024*1024);        //设置上传文件大小的临界值,大于这个值就先存在临时目录,然后在上传到服务器。小于这个值直接上传到服务器。10M diff.setRepository(new File(this.getServletContext().getRealPath("tmp"))); //设置临时文件目录                         //临时文件设置好之后,就可以处理上传的文件了。 ServletFileUpload upload=new ServletFileUpload(diff); //文件上传对象upload按照文件工厂diff的配置

    /*接下来可以对request进行解析了, *request的数据分为普通表单数据和文件,需要区别对待处理。 * 对request解析出来的是List<FileItem>类型的,一个表单值就是一个对象。 */ List<FileItem> items=null; try { items=upload.parseRequest(request); //对request进行解析,解析出来的是List<FileItem>类型的 for(FileItem item:items){ //对表单里所有数据进行循环,然后对表单数据和文件数据区分处理 if(item.isFormField()){ //如果为表单数据 if("desc".equals(item.getFieldName())) {             //如果表单元素的元素名是desc, System.out.println("文件的描述为:"+item.getString("UTF-8"));    //item.getString("UTF-8")解决乱码问题 } }else{ //否则为文件数据 String path=this.getServletContext().getRealPath("upload");       //获取存放上传文件的文件夹真实路径(即在硬盘上的路径,而不是在项目中的相对路径) OutputStream os=new FileOutputStream(new File(path+"/"+item.getName())); //用户上传文件的路径为path文件夹里,名字是item.getName()即上传时候的文件名

    if(item.isInMemory()){     // 如果文件是直接存放在内存的,即小于临时文件的临界值,小于10M,可以直接将用户上传的文件直接拷贝到upload文件里。 os.write(item.get()); //item.get()得到用户上传的文件的数据流 }else{           //如果上传文件大小大于临界值,这个文件会现在临时文件夹tmp里,然后再上传到upload文件夹里。 IOUtils.copy(item.getInputStream(), os); //直接将用户文件的数据流拷贝到输出流即可 } os.close(); } } } catch (Exception e) { e.printStackTrace(); } }
    •  真实路径:

    右击项目名,选择“properties”, 如图

    打开图中的path:“C:UsersAdministratorworkspace”  ,选择第一个文件夹

    找到这个文件夹

     

    找到项目名,点击进去:

    即可找到upload或者tmp文件夹。





     二、文件下载

             

      2.1  编写html页面

    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
    <script type="text/javascript" src="./js/lib/jquery.js">
    	$(function(){
    		$('button').click(function(){
    			
    			$('form').submit();
    		});
    	});
    </script>
    </head>
    <body>
    	<form action="servlet/filedown"  >
    		<button>下载文件</button>
    	</form>
    </body>
    </html>
    

      2.2  编写servlet

    FileDown.java(url-patting=servlet/filedown)

    package servlet;
    
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.apache.commons.io.IOUtils;
    
    
    public class FileDown extends HttpServlet {
    	private static final long serialVersionUID = 1L;
           
       
        public FileDown() {
            super();
            // TODO Auto-generated constructor stub
        }
    
    
    	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		this.doPost(request, response);
    	}
    
    
    	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		String fileName="中文.zip";
    		
    		fileName=new String(fileName.getBytes(),"ISO8859-1");      //设置文件名编码
    		
    		response.setHeader("Content-Disposition","attachment;filename="+fileName);  //当Content-Type 的类型为attachment(附件)时 , 这个信息头会告诉浏览器这个文件的名字和类型。

    InputStream is=this.getServletContext().getResourceAsStream("upload/mysql驱动.zip");    //把供用户下载的文件转换为输入流   OutputStream os=response.getOutputStream();               //得到响应给用户的输出流。          IOUtils.copy(is, os);            //把文件的输入流拷贝到响应给用户的输出流, is.close(); os.close(); } }

     结果:

  • 相关阅读:
    A simple class to play sound on netcf
    NETCF运行平台检测
    [翻译]XNA 3.0 Game Programming Recipes之thirtynine
    [翻译]XNA 3.0 Game Programming Recipes之thirtyfour
    [翻译]XNA 3.0 Game Programming Recipes之thirtyseven
    [翻译]XNA 3.0 Game Programming Recipes之thirtysix
    [翻译]XNA 3.0 Game Programming Recipes之thirtyfive
    [翻译]XNA 3.0 Game Programming Recipes之forty
    [翻译]XNA 3.0 Game Programming Recipes之thirtyeight
    [翻译]XNA 3.0 Game Programming Recipes之fortyone
  • 原文地址:https://www.cnblogs.com/shyroke/p/6486668.html
Copyright © 2011-2022 走看看