zoukankan      html  css  js  c++  java
  • jsp文件上传、下载

    一、文件上传

           上传文件是Web开发中经常要用到的功能:例如在基于B/S的人事信息管理系统中上传照片,在新闻发布系统中上传图片等等。。。。。要实现文件上传功能,就需要综合利用java中的文件输入和输出相关的类。

          在TCP/IP中,最早出现的文件上传机制是FTP。它是将文件由客服端发送到服务器的标准机制,能够考虑到跨平台的文本和二进制格式文件。但是在jsp编程中不能使用FTP方法来上传文件,这是由jsp 运行机制所决定的。

          下面是上传文件的jsp页面:

    <form action="file?file=upload" method="post" enctype="multipart/form-data">
        请选择你要上传的文件:<input type="file" name="upload" siez="16"><br>
        <input type="submit" value="提交"> 
      </form>
     

          对于文件上传表单处理其中method必须为post,也要增加类型enctype="multipart/form-data"。这样就可以把文件中的数据作为流式数据上传。当然无论是什么文件格式,均可以。。。

         下面是servlet 处理程序:

     

                     //接收上传文件内容中临时文件的文件名
    		String tempFileName = new String("tempFileName");
    		//tempfile 对象指向临时文件
    		File tempFile = new File("D:/"+tempFileName);
    		//outputfile 文件输出流指向这个临时文件
    		FileOutputStream outputStream = new FileOutputStream(tempFile);
    		//得到客服端提交的所有数据
    		InputStream fileSourcel = request.getInputStream();
    		//将得到的客服端数据写入临时文件
    		byte b[] = new byte[1000];
    		int n ;
    		while ((n=fileSourcel.read(b))!=-1){
    			outputStream.write(b,0,n);
    		}
    		
    		//关闭输出流和输入流
    		outputStream.close();
    		fileSourcel.close();
    		 
    		//randomFile对象指向临时文件
    		RandomAccessFile randomFile = new RandomAccessFile(tempFile,"r");
    		//读取临时文件的第一行数据
    		randomFile.readLine();
    		//读取临时文件的第二行数据,这行数据中包含了文件的路径和文件名
    		String filePath = randomFile.readLine();
    		//得到文件名
    		int position = filePath.lastIndexOf('\\');
    		CodeToString codeToString = new CodeToString();
    		String filename = codeToString.codeString(filePath.substring(position,filePath.length()-1));
    		//重新定位读取文件指针到文件头
    		randomFile.seek(0);
    		//得到第四行回车符的位置,这是上传文件数据的开始位置
    		long  forthEnterPosition = 0;
    		int forth = 1;
    		while((n=randomFile.readByte())!=-1&&(forth<=4)){
    			if(n=='\n'){
    				forthEnterPosition = randomFile.getFilePointer();
    				forth++;
    			}
    		}
    		
    		//生成上传文件的目录
    		File fileupLoad = new File("D:/work space/JSP workspace/jsp_servlet_upAndLoad/file","upLoad");
    		fileupLoad.mkdir();
    		//saveFile 对象指向要保存的文件
    		File saveFile = new File("D:/work space/JSP workspace/jsp_servlet_upAndLoad/file/upLoad",filename);
    		RandomAccessFile randomAccessFile = new RandomAccessFile(saveFile,"rw");
    		//找到上传文件数据的结束位置,即倒数第四行
    		randomFile.seek(randomFile.length());
    		long endPosition = randomFile.getFilePointer();
    		int j = 1;
    		while((endPosition>=0)&&(j<=4)){
    			endPosition--;
    			randomFile.seek(endPosition);
    			if(randomFile.readByte()=='\n'){
    				j++;
    			}
    		}
    		
    		//从上传文件数据的开始位置到结束位置,把数据写入到要保存的文件中
    		randomFile.seek(forthEnterPosition);
    		long startPoint = randomFile.getFilePointer();
    		while(startPoint<endPosition){
    			randomAccessFile.write(randomFile.readByte());
    			startPoint = randomFile.getFilePointer();
    		}
    		//关闭文件输入、输出
    		randomAccessFile.close();
    		randomFile.close();
    		tempFile.delete();

             其中CodeToString()方法是一个中文字符处理的方法。如果文件不进行编码转换,则上传后的文件名将会是乱码,接收的文件数据也会是乱码:

            下面是CodeToString()源代码:

     

    //处理中文字符串的函数
    	public String codeString(String str){
    		String s = str;
    		try {
    			byte[] temp = s.getBytes("utf-8");
    			s = new String(temp);
    			return s ;
    		} catch (UnsupportedEncodingException e) {
    			e.printStackTrace();
    			return s;
    		}
    	}

    二:文件下载
             实现文件下载的最简单的方法就是使用超链接。假设在服务器上web目录下地upload子目录存在user.doc这个文档。如:

    <a href="http://localhost:8080/upload/user.doc">下载user.doc</a>

    当单击这个超级链接时,将会在浏览器中直接打开这个文档,就像是把word软件嵌入在浏览器中一样。

         打开文档后就可以实现另存为了。当然在web上,最常见的方式是单击链接后,出现“另存为”对话框:

     

    //获取要下载的文件名
    		String filename = request.getParameter("name");
    		//得到想客服端输出的输出流
    		OutputStream outputStream = response.getOutputStream();
    		//输出文件用的字节数组,每次向输出流发送600个字节
    		byte b[] = new byte[600];
    		//要下载的文件
    		File fileload = new File("D:/work space/JSP workspace/jsp_servlet_upAndLoad/file/upLoad",filename);		
    		//客服端使用保存文件的对话框
    		response.setHeader("Content-disposition", "attachment;filename="+filename);
    		//通知客服文件的MIME类型
    		response.setContentType("application/msword");
    		//通知客服文件的长度
    		long fileLength = fileload.length();
    		String length = String.valueOf(fileLength);
    		response.setHeader("Content_length", length);
    		//读取文件,并发送给客服端下载
    		FileInputStream inputStream = new FileInputStream(fileload);
    		int n = 0;
    		while((n=inputStream.read(b))!=-1){
    			outputStream.write(b,0,n);
    		}

            在该程序中,response对象的setContentType()用来定义服务器发送给客服端内容的MIME类型。这里对MIME就不特别介绍了。事实上,凡是浏览器能处理的所有资源都有对应的MIME资源类型。在与服务器的交互中,浏览器就是对html、jsp等文件浏览器直接将其打开。对于word、excel等浏览器自身不能打开的文件则调用相应的方法。对于没有标记MIME类型的文件。浏览器则根据其扩展名和文件内容猜测其类型。。。


  • 相关阅读:
    hdu 5400 Arithmetic Sequence(模拟)
    hdu 5402 Travelling Salesman Problem(大模拟)
    hdu 5009 Paint Pearls (dp)
    poj 1236 Network of Schools(tarjan+缩点)
    hdu 3836 Equivalent Sets(tarjan+缩点)
    编程之美2015初赛第一场 hihoCoder #1156 : 彩色的树(染色问题)
    hdu 2807 The Shortest Path(矩阵+floyd)
    The Unique MST (判断是否存在多个最小生成树)
    Advanced Fruits(好题,LCS的模拟)
    Dark roads(kruskal)
  • 原文地址:https://www.cnblogs.com/oversea201405/p/3752312.html
Copyright © 2011-2022 走看看