一、使用Servlet响应给用户弹出下载框
servlet代码
//1、通过文件流加载图片
//获取图片的绝对路径
String realPath = request.getServletContext().getRealPath("img/2.jpg");
FileInputStream in = new FileInputStream(realPath);
//2.设置一个提供用户下载应答头 不设置下载应答头,则直接在页面显示图片
//filename 呈现给用户图片的名字
response.setHeader("Content-Disposition","attachment; filename=2.jpg");
//3.通过流给用户输出图片
ServletOutputStream out = response.getOutputStream();
int len = 0;
byte flush[] = new byte[1024*10];
while((len = in.read(flush)) != -1){
out.write(flush,0,len);
}
in.close();
二、使用servlet让用户上传文件到服务器并进行接收
注意:这里的jsp文件都需要使用multipart/form-data + post的方式请求数据,方法才有效,否则无法上传
(1)servlet获取数据应通过流获取数据 request.getInputStream()
servlet代码
//通过流获取数据
ServletInputStream in = request.getInputStream();
FileOutputStream out = new FileOutputStream("d:/123.txt");
int len = 0;
byte flush[] = new byte[1024*10];
while( (len = in.read(flush)) != -1) {
out.write(flush, 0, len);
}
out.flush();
out.close();
jsp代码(剩余的两种方法jsp写法都和这个差不多)
<body>
<form action="up.do" method="post" enctype="multipart/form-data">
用户名:<input type="text" name="username"><br>
上传文件:<input type="file" name="myfile"><br>
<button>提交</button>
</form>
</body>
(2)web3.0之后,servlet提供了一套方便解析multipart的数据的解决方案
注意:该写法需要在web注解下加多一句或在web.xml文件中写明
否则无法生效
servlet代码
Part part2 = request.getPart("myfile");
System.out.println(request.getParameter("myfile"));//获取用户输入的数据
System.out.println(part2.getName());//获取自己设置name的值
//System.out.println(part2.getSubmittedFileName());//web3.1才有的方法 获取提交的名字
System.out.println(part2.getSize()); //获取提交属性的大小
//通过流进行获取
InputStream in = part2.getInputStream();
FileOutputStream out = new FileOutputStream("d:/321.jpg");
int len = 0;
byte flush[] = new byte[1024*10];
while( (len = in.read(flush)) != -1) {
out.write(flush, 0, len);
}
out.flush();
out.close();
(3)使用别人写好的代码
(该方法比较方便,需要的话可以从apache.org官网中在最下方点击commons,下载对应的jar包和代码。以下代码可供大部分情况使用,可根据实际需要进行修改,使用前需要导入对应的jar包)
servlet代码
String tempDirectory = "d:/tmp/"; //要在最后加上斜杠:temp/ 存放的临时目录
String fileDirectory="d:/afile/"; //文件最终上传目录 两个目录都需要自己创建,servlet不会进行创建
try {
int sizeThreshold = 1024 * 64; //写满该大小的缓存后,存入硬盘中。
File repositoryFile = new File(tempDirectory);
FileItemFactory factory = new DiskFileItemFactory(sizeThreshold, repositoryFile);
ServletFileUpload upload = new ServletFileUpload(factory); //表示一次上传的内容设置的对象
upload.setSizeMax(500 * 1024 * 1024); // 每个文件不能超过500M
upload.setHeaderEncoding("utf-8"); // 设置字符集
List items = upload.parseRequest(request); //这里开始执行上传
Iterator iter = items.iterator();
while (iter.hasNext()) {
FileItem item = (FileItem) iter.next(); //FileItem就是表示一个表单域。 part
if(item.isFormField()){ //isFormField方法用于判断FileItem是否代表一个普通表单域(即非file表单域)
System.out.println("***"+item.getFieldName()); //返回表单域的名字
System.out.println("***"+item.getString("utf-8")); //返回表单域的值
}else {
String fieldName = item.getFieldName(); //获取表单域name属性的值
String fileName = item.getName(); //返回该文件在客户机上的文件名。e.g: e:\dianying\\video\1.wmv
System.out.println("*****"+fieldName);
System.out.println("*****"+new String(fileName.getBytes(),"utf-8")); //上面设置了字符集,这里就可以不用这么写
String fileType = fileName.substring(fileName.lastIndexOf("."));
File uploadedFile = new File(fileDirectory+new Date().getTime()+fileType);
item.write(uploadedFile);
}
}
} catch (Exception e) {
e.printStackTrace();
}
对应上面代码的jar包:(可自行搜索下载使用)