文件上传与下载
文件上传与下载
1、文件上传
-
1、要有一个form标签,method=post请求(地址栏有长度限制,不能用get)
-
2、form标签的encType属性的值必须为multipart/form-data(声明数据以多段形式拼接,以流形式传给服务器)
-
3、在form标签使用input type=file添加上传文件
-
4、在服务端编写接收代码
代码示例:
<form method="post" enctype="myltipart/form-data"> 用户名:<input type="text" name="usrname"/> 头像:<input type="file" name="photo" /> <input type="submit" value="提交" /> </form>public class upload extends HttpServlet{ @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { super.doGet(req, resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //以流的形式接收 ServletInputStream inputStream=req.getInputStream(); //创建一个缓存区 byte[] buffer= new byte[1024 * 1024]; //返回接收字节 int read=inputStream.read(buffer); } }需要用到的两个jar包:commons-io 与commons-fileupload
fileupload常用类和方法: Fileitem类:上传的文件对象,可以是多个文件,每个上传的文件都是一个单独的FileItem对象。 DiskFileItemFactory:磁盘文件工厂类,设置上传文件保存的磁盘目录,缓冲区大小。 FileItem:上传的文件对象,可以是多个文件,每个上传的文件都是一个单独的FileItem对象。
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//判断上传的数据是否是多端数据
if(ServletFileUpload.isMultipartContent(req)){
//创建diskfileItemFactory实现类
DiskFileItemFactory diskFileItemFactory=new DiskFileItemFactory();
//创建用于解析上传数据的工具类
ServletFileUpload servletFileUpload=new ServletFileUpload(diskFileItemFactory);
try {
//获得每一个表单项
List<FileItem> list=servletFileUpload.parseRequest(req);
//循环判断是不是普通的表单数据
for (FileItem fileItem : list) {
if (fileItem.isFormField()){
//true 普通表单项
System.out.println("表单项属性值"+fileItem.getFieldName());
System.out.println("表单项value值"+fileItem.getString("UTF-8"));
}else {
//文件表单
System.out.println("表单项name属性值"+fileItem.getFieldName());
System.out.println("文件名"+fileItem.getName());
//写入磁盘
fileItem.write(new File("e:\\"+fileItem.getName()));
}
}
} catch (FileUploadException e) {
e.printStackTrace();
}
}
2、下载文件
//获取下载的文件名
String filename="1.jpg";
String mineType=getServletContext().getMimeType("/file/"+filename); //获取文件类型
//设置响应头,告诉客户端下载 attachment是附件的意思,文件名是指被下载的文件文件名。
resp.setHeader("Content-Dispositon","attachment;filename=文件名");
//2、读取下载的文件内容 通过ServletContext可以读取
ServletContext servletContext=getServletContext();
//斜杠=http://ip:port/工程名/
InputStream inputStream=servletContext.getResourceAsStream("/file/"+filename);
//获取输出流
OutputStream outputStream=resp.getOutputStream();
//将输入流复制到输出流
IOUtils.copy(inputStream,outputStream);
如果文件名是中文,可以通过URLEncoder.encode进行编码转换
resp.setHeader("Content-Dispositon","attachment;filename=中国.jpg");//有中文会乱码
resp.setHeader("Content-Dispositon","attachment;filename="+URLEncoder.encode("中国.jpg","UTF-8"));

浙公网安备 33010602011771号