按老师的说法,以后几天的课程不用像前几天那样紧张了,可以多拿点时间消化一下前几天的学习了东西了,这几天的讲的内容太多而且大部分都很重要还不容易理解,对于一些内容到现在还是不是很明白,我想这是不是在课程安排的时候特意这么做的,在进行了几天比较难的课程后插一段比较简单的,要是真是这样的话这设计课程的人也太牛X了,今天上课主要的内容是文件的上传和下载的操作,讲完这些基本操作后老师带我们做了一个小案例,把代码综合练习了一下,要求把文件上传到服务器端,并把文件信息放入数据库,还可以在页面查看所有上传文件的信息列表,通过读取数据库信息实现下载,案例比较简单,但是最后还是出了问题,可以下载不带中文字符的资源,但是带中文字符就会出现乱码,报一个文件找不到异常,上课老师讲了两种防止文件乱码的方式:
response.setContentType("application/x-msdownload");
response.setHeader("Content-Disposition", "attachment;filename="
+ URLEncoder.encode(filename, "UTF-8"));
response.setHeader("Content-Disposition", "attachment;filename="
+ new String(filename.getBytes("ISO-8859-1"),"gbk"));
基于Commons-fileupload 组件的文件上传
表单中的表单元素 <input type=“file” />,会自动生成一个输入框和一个按钮,输入框可供用户填写本地文件的文件名和路径名,按钮可以让浏览器打开一个文件选择框供用户选择文件。
使用表单上传文件首先要指定表单 enctype 的值为 multipart/form-data,它指定了发向服务器的浏览器使用的编码类型,表示表单以二进制传输数据 。
导入commons-io-1.4.jar和commons-fileupload-1.2.1.jar两个jar包。
// Create a factory for disk-based file items
FileItemFactory factory = new DiskFileItemFactory();
// Create a new file upload handler
ServletFileUpload upload = new ServletFileUpload(factory);
// Parse the request
try {
List<FileItem> items = upload.parseRequest(request);
Iterator<FileItem> iter = items.iterator();
while (iter.hasNext()) {
FileItem item = (FileItem) iter.next();
if (item.isFormField()) {
String name = item.getFieldName();
String value = item.getString();
} else {
String fieldName = item.getFieldName();
String fileName = item.getName();
String contentType = item.getContentType();
boolean isInMemory = item.isInMemory();
long sizeInBytes = item.getSize();
File uploadedFile = new File("E://"+fileName+"");
item.write(uploadedFile);
}
}
} catch (FileUploadException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
文件下载
从JSP页面点击链接下载文件流程:
1 点击链接到servlet中处理,在servlet中首先要设置 2 个报头:
/*
*设置响应报头 contentType: application/x-msdownload -->
*告诉浏览器其所输出的内容的类型不是普通的文本文件或 HTML 文件,
*而是一个要保存到本地的下载文件
*/
//response.setHeader("content-type", "application/x-msdownload"); //另一种设置方法
response.setContentType("application/x-msdownload");
/*
* 设置响应抱头 Content-Disposition: attachment
* Web 服务器希望浏览器不直接处理相应的实体内容,
* 而是由用户选择将相应的实体内容保存到一个文件中
* defaultname是默认保存的文件名
*/
//response.setHeader("Content-Disposition ", " attachment; filename=defaultname "); //另一种设置方法
response.setHeader("Content-Disposition", "attachment; filename=defaultname");
2 读取需要下载的文件
//获取下载文件存放目录的绝对路径
String path = this.getServletContext().getRealPath("/download");
//得到要下载文件的绝对路径
String downpath = path + "//LICENSE.txt";
//读取文件
BufferedInputStream bfis = new BufferedInputStream(new FileInputStream(downpath));
3 将文件写入到响应输出流
BufferedOutputStream bfos = new BufferedOutputStream(response.getOutputStream());
byte [] b = new byte[200*1024];
int len = 0;
while((len=bfis.read(b))!=-1){
bfos.write(b,0,len);
}
bfis.close();
bfos.close();
我挨个试了都不好使,从网上也找了几个类似的解决方案,但是天不助我,纠结了一个多小时找不到原因,郁闷...
简单文件上传和下载的步骤和基本代码: