SmartUpload实现文件的上传与下载

霸气de小男生 提交于 2019-12-04 21:02:19

###1.文件上传页面端的配置

  1. 页面端的encode:gbk(要将页面端的字符编码设置为``` gbk
1. 表单提交方式:```
post
  1. 设置``` enctype:”multipart/form-data”

###2.常见的servlet上传组件
1. apache comments FileUpload
1. SmartUpload(下面我主要以这种为例,实现文件上传)

### 3.SmartUpload实现文件上传的步骤(见代码即可)
 1. 具体操作步骤代码

public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

	//获取服务器指定目录的绝对路径
	String dir = this.getServletContext().getRealPath("files");
	List list = new ArrayList();
	//创建文件上传组件对象
	SmartUpload su = new SmartUpload();
	//初始化请求,响应及配置
	try {
		su.initialize(this, request, response);
		
		//设置允许上传的文件列表
		su.setAllowedFilesList("txt,png,jpg,gif,doc,xls");
		//设置允许单个文件的最大大小
		su.setMaxFileSize(1024*1024*20);
		//设置允许总共文件的上传大小
		su.setTotalMaxFileSize(1024*1024*100);
		//上传
		su.upload();
		/**********获取上传过来文件**********/
		Files files = su.getFiles();
		//获取上传的文件数
		int count = files.getCount();
		//System.out.println("上传的文件数:"+count);
		for(int i = 0;i < count;i++){
			//注意与io包中的file区别
			com.jspsmart.upload.File file = files.getFile(i);
			//获取文件名称
			String fileName = file.getFileName();
			if(!"".equals(fileName)){
				//将当前文件存储到服务器的指定位置中
				//java.io.File.separator与项目有关的分隔符
				file.saveAs(dir+java.io.File.separator+fileName);
				list.add(fileName);
			}
		}
		request.setAttribute("list", list);
		request.getRequestDispatcher("main.jsp").forward(request, response);
		
	} catch (SmartUploadException e) {
		e.printStackTrace();
	}
}

### 4.文件的下载
1. 接着上面上传的例子,如果我的文件上传完成后,在指定目录
下面会有我们指定的文件,现在,上传完成后,我们跳转到指定页面,跳转的同时,我们传递参数文件名的集合(因为我们要根据文件名进行下载)。

list.add(fileName); } } request.setAttribute("list", list); request.getRequestDispatcher("main.jsp").forward(request, response);

1. 我们在页面上获取到文件名之后进行下载指定文件
<c:forEach items="${list}" var="fileName">
	<P><a href="DownloadServlet?fname=${fileName}">${fileName}</a></P>
</c:forEach>
1. 下载部分,这里讲两种方法
    1. 利用smartUpload

SmartUpload su = new SmartUpload(); su.initialize(this,request,response); try { su.downloadFile(path); } catch (SmartUploadException e) { e.printStackTrace(); }

    1. 因为我们已经获得文件的位置,我们根据之前我们读取文件的方式进行下载文件

String name = request.getParameter("fname"); String path = this.getServletContext().getRealPath("files"); path = path + java.io.File.separator + name;

	/*BufferedInputStream bis = new BufferedInputStream(new FileInputStream(path));
	
	//设置响应方式,以附件响应
	response.setHeader("Content-Disposition", "attachment;filename="+new String(name.getBytes("gbk"),"iso-8859-1"));
	
	BufferedOutputStream bos = new BufferedOutputStream(response.getOutputStream());
	byte[] b = new byte[1024];
	int len = 0;
	while((len = bis.read(b)) != -1){
		bos.write(b,0,len);
	}
	bos.close();
	bis.close();*/

    **关于第一种方式,目前我没有遇见中文乱码的问题,如果出现则估计不好解决。则可以采用第二种方式
    **

    **第二种方式就是我们要设置响应方式,以附件形式响应,同时filename的部分,如果name是中文,我们         需要现将name以gbk的形式进行读取,然后又转码成"iso-8859-1",不然是下载不了图片的。
**
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!