下载文件的代码:
步骤
//1、 准备在显示的图片名
String name = "我的图片.jpg";
//2、如果是中文名必须转码
name = URLEncoder.encode(name,"UTF-8");
//3、获取真实的文件
String path = getServletContext().getRealPath("/a.jpg");
//4、设置显示类型为下载
resp.setContentType("application/force-download");
//5、设置响应头
resp.setHeader("Content-Disposition","attachment;filename=\""+name+"\"");
//6、以下是模板代码I/O
InputStream in = new FileInputStream(path);
byte[] b = new byte[1024];
int len = 0;
OutputStream out = resp.getOutputStream();
while((len=in.read(b))!=-1){
out.write(b,0,len);
}
例子:
package cn.hncu.servlet2;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;
/**
* Created by jan on 2016/7/20.
*/
@WebServlet(value = "/down",name = "DownServlet")
public class DownServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置响应头--内容接收程序--浏览器看到这个响应头,就会把它认为的下载程序打开(如果识别迅雷那么就会自动打开迅雷,如果没有其它的则打开一个“文件另存为”的对话框
response.setContentType("application/force-download");
//设置响应头--告诉浏览器:文件名+文件类型
String fileName="你好.jpg";
//解决中文文件名乱码问题(只要用下面一句对文件名进行编码就行了)
fileName= URLEncoder.encode(fileName,"utf-8");
response.setHeader("Content-Disposition", "attachment;filename=\""+fileName+"\"");//注意,“attachment;” 不能少,否则浏览器会直接在新窗口中打开
//注意,“attachment;” 不能少,否则浏览器会直接在新窗口中打开
//向浏览器发送要下载的文件数据
String relpath=getServletContext().getRealPath("/imgs/1.jpg");//真正下载的文件数据在这里
InputStream in=new FileInputStream(relpath);
OutputStream out=response.getOutputStream();
byte buf[]=new byte[1024];
int len;
while ((len=in.read(buf))!=-1){
out.write(buf,0,len);
}
out.close();
in.close();
}
}
上传文件:
表单:
客户端发送HTTP必须使用multipart/form-data数据类型,表示复合数据类型。
即:
在表单中使用html标签。
需要的包:
Commons-fileupload.jar,核心上传文件工具都在这个包中。
commons-io.jar – 上传文件所需要的包
例子:
上传文件。
打散。
显示所有已经上传的文件。
实现指定文件名的下载。
package cn.hncu.updown;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.ProgressListener;
import org.apache.commons.fileupload.disk.DiskFileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.io.FileUtils;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;
import java.util.UUID;
/**
* Created by jan on 2016/7/22.
*/
@WebServlet(name = "UploadServlet3",value = "/upload3")
public class UploadServlet3 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
response.getWriter().println("不支持GET方式上传");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//※下面这句解决上传文件名的中文乱码
//注意,下面这句设置中文,如果是“multipart/form-data”表单,可以设置其中file组件的文件名,但对其中的普通表单组件无效。
//注意,下面这句设置中文,如果是我们以前用的“application/x-www-form-urlencoded”表单,可以设置其中的普通表单组件。
response.setContentType("text/html;charset=utf-8");
final PrintWriter out = response.getWriter();
String path = request.getServletContext().getRealPath("/imgs");
//☆防黑2--非multipart表单提交
//手动方式
/*String type=request.getContentType();
if(!type.equals("multipart/form-data")){
out.print("不支持普通表单提交!");
return;
}*/
boolean boo = ServletFileUpload.isMultipartContent(request);
if (!boo) {
out.print("不支持普通表单提交!");
return;
}
DiskFileItemFactory factory = new DiskFileItemFactory();
//先获取所接收文件要保存的路径
factory.setRepository(new File("g:/a"));//文件上传需要临时目录(如果不指定,那么该目录就是tomcat/temp )
factory.setSizeThreshold(1024 * 8);//设置缓冲区的位置和大小
ServletFileUpload upload = new ServletFileUpload(factory);
upload.setFileSizeMax(1024 * 1024 * 5);//设置每个文件最大为5M
upload.setSizeMax(1024 * 1024 * 80);//所有上传文件大小之和的最大值,此处设最多能上传80M
upload.setHeaderEncoding("utf-8");//用于设置文件名的编码,相当于:request.setCharacterEncoding("utf-8");
//☆文件上传进度功能---设置监听器
upload.setProgressListener(new ProgressListener() {
private int pre=0;
@Override//参数解析---- pBytesRead:已上传字节数 pContentLength:pBytesRead pItems:文件序号(从1开始的)
public void update(long pBytesRead, long pContentLength, int pItems) {
double d = pBytesRead*100.0/pContentLength;//计算百分比
int dd=(int)d;
if(pre!=dd){
out.print(dd+"%<br/>");
pre=dd;
}
}
});
//以下开始解析
FileItem fi2 = null;
try {
List<FileItem> list = upload.parseRequest(request);
for (FileItem fi : list) {
fi2 = fi;
if(fi.isFormField()){//普通表单组件
String str = fi.getString("utf-8");
System.out.println("普通表单组件提交的内容:"+str);
}else {//表单中的:file组件
String fileName = fi.getName();
String ext = fileName.substring(fileName.lastIndexOf("."));
//文件名不能用中文,必须转换成ascii码的格式,而且文件名不能重复(必须保证唯一),因此采用UUID来实现
String newFileName = UUID.randomUUID().toString().replace("-", "") + ext;
//☆打散目录(因为对于普通机器,一个文件夹如果存储的文件个数超过1000,性能将会急剧下降!! )
String dir1 = Integer.toHexString(fileName.hashCode() & 0xf);
String dir2 = Integer.toHexString((fileName.hashCode() & 0xf0) >> 4);
File dir = new File(path + "/" + dir1 + "/" + dir2);
if (!dir.exists()) {
dir.mkdirs();
}
// FileUtils.copyInputStreamToFile(request.getInputStream(),new File(dir,newFileName));
fi.write(new File(dir, newFileName));
}
}
} catch (FileUploadException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (fi2 != null) {
fi2.delete();//清临时文件
}
}
}
}