文件上传和下载以及图片的动态加载

版权声明:该版权归博主个人所有,在非商用的前提下可自由使用,转载请注明出处. https://blog.csdn.net/qq_24696571/article/details/90112487
  • 导入jar包commons-io-2.4.jar和commons-fileupload的jar包
  • post请求
  • form表单提交,要加属性标签:enctype="multipart/form-data"
  • servlet中,boolean isMultipart = ServletFileUpload.isMultipartContent(request)可以判断表单请求是否是文件上传.
  • 文件上传,简单案例:
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>文件上传</title>
	</head>
	<body>
		<!--form表单, 必须是post请求 , 必须添加enctype属性标签-->
		<form action="upload" method="post" enctype="multipart/form-data">
			
			<!--选择type=file-->
			<input type="file" name="myfile" id="myfile"/>
			<input type="submit" value="上传"/>
		</form>
	</body>
</html>

package com.credi.servlet;

import java.io.File;
import java.io.IOException;
import java.util.List;

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 org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;


@WebServlet("/upload")
public class UploadServlet extends HttpServlet{

	private static final long serialVersionUID = 1L;
	
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// 1 . 得到服务器真实路径
		String path = this.getServletConfig().getServletContext().getRealPath("/");
		System.out.println(path);
		// 2 . 创建工厂
		DiskFileItemFactory factory = new DiskFileItemFactory();
		// 3. 设置缓冲大小
		factory.setSizeThreshold(1024*3);
		// 4. 设置上传处理对象
		ServletFileUpload upload = new ServletFileUpload(factory);
		// 5. 设置上传限制
		upload.setFileSizeMax(3*1024*1024); // 上传最大文件大小
		upload.setHeaderEncoding("utf-8");  // 字符编码
		// 6. 解析请求
		try {
			List<FileItem> items = upload.parseRequest(req);
			// 校验非空
			if(items != null){
				//遍历items集合
				for( FileItem fileItem : items){
					//判断是否是普通表单                        并且           是否上传了内容
					if(!fileItem.isFormField()&&fileItem.getName()!=null&&!"".equals(fileItem.getName())){
						//得到上传的文件名
						String fileName = fileItem.getName();
						//文件的上传服务器的路径
						File uploader = new File(path + "/upload/");
						//文件夹是否存在
						if(!uploader.exists()){
							//不存在就创建文件
							uploader.mkdirs();
						}
						File file = new File(uploader,fileName);
						//上传文件
						fileItem.write(file);
					}
				}
			}
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

  • 文件下载:
  • 1 . 超链接下载:
<!--超链接下载-->
	<!--浏览器能识别的格式,例如图片,文本, 会在网页中显示-->
	<a href="statics/images/a.jpe" target="_blank">图片</a>
	<a href="statics/a.txt" target="_blank">文本</a>
	<!--浏览器不能识别的格式,例如快捷方式,应用程序, 就会弹出框让用户下载-->
	<a href="statics/qqmusic.lnk" target="_blank">快捷方式</a>
	<a href="statics/qqmusic.exe"target="_blank">应用程序</a>
  • 2 .第三方下载:
<!--随便一种方式去请求servlet-->
<a href="download?fileName=a.jpg">下载图片</a>
package com.credi.servlet;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;



@WebServlet("/download")
public class DownLoadServlet extends HttpServlet{

	private static final long serialVersionUID = 1L;
	
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		//设置响应编码
		resp.setCharacterEncoding("utf-8");
		//随意各种方式 ,  拿到下载图片的名称
		String fileName =req.getParameter("fileName");
		//图片在服务器的真实路径
		String path = this.getServletConfig().getServletContext().getRealPath("/upload/"+fileName);
		//下载弹出框的设置
		resp.setHeader("content-disposition", "attachment;filename="+fileName);
		
		//创建File对象
		File file = new File(path);
		//文件输入流
		InputStream is = new FileInputStream(file);
		//响应的输出流
		ServletOutputStream os = resp.getOutputStream();
		//定义字节数组
		byte[] car = new byte[1024];
		int len = 0;
		//读进来
		while(-1 != (len=is.read(car))){
			//响应出去
			os.write(car,0,len);
		}
		
		//关闭
		os.flush();
		os.close();
		is.close();
	}

}

  • servlet3.0之后的文件上传
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>文件上传</title>
	</head>
	<body>
		<!--form表单, 必须是post请求 , 必须添加enctype属性标签-->
		<form action="upload" method="post" enctype="multipart/form-data">
			
			<!--选择type=file , 请记住它的name值-->
			<input type="file" name="myfile" id="myfile"/>
			<input type="submit" value="上传"/>
		</form>
	</body>
</html>
package com.credi.servlet;

import java.io.File;
import java.io.IOException;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;


@WebServlet("/upload")
//1. 必须要加此注解
@MultipartConfig         
public class UploadServlet extends HttpServlet{

	private static final long serialVersionUID = 1L;
	
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// 2 . 得到Part对象
		Part part = req.getPart("myfile"); //type=file的input文件上传框标签的name值
		// 3 . 得到上传文件的名称
		String fileName = part.getSubmittedFileName();
		// 4 . 文件上传服务器的真实路径
		String path = this.getServletContext().getRealPath("/upload/");
		
		// 判断文件夹是否存在 , 不存在则创建
		File file = new File(path);
		//文件夹是否存在
		if(!file.exists()){
			//不存在就创建文件
			file.mkdirs();
		}
		
		// 5 . 上传文件 (服务器存放文件的路径+文件名)
		part.write(path + fileName);
	}
}


  • 从数据库动态获取用户图片信息后 , 实现图片的动态加载
<img src="user?action=userHead&imageName=${user.head }">
//借助commons

private void userHead(HttpServletRequest request, HttpServletResponse response) throws IOException {
		// 1、接收参数(图片名称)
		String imageName = request.getParameter("imageName");
		
		// 2、判断是否为空
		if (StringUtil.isEmpty(imageName)) {
			return;
		}
		
		// 3、得到文件存放在服务器的真实路径 request.getServletContext().getRealPath("/WEB-INF/upload/" + 头像名称);
		String filePath = request.getServletContext().getRealPath("/WEB-INF/upload/" + imageName);
		
		// 4、通过路径得到file对象
		File file = new File(filePath);
		
		// 5、判断file对象是否存在,并且是一个标准文件
		if (!file.exists() || !file.isFile() ) {
			return;
		}
		
		// 6、截取图片名称,得到图片后缀
		String pic = imageName.substring(imageName.lastIndexOf(".") + 1, imageName.length());
		// 判断是否为空
		if (StringUtil.isEmpty(pic)) {
			return;
		}
		
		// 7、根据不同的后缀,设置对象的响应MIME类型
		if ("gif".equals(pic.toLowerCase())) {
			response.setContentType("image/gif");
		} else if ("png".equals(pic.toLowerCase())) {
			response.setContentType("image/png");
		} else if ("jpg".equals(pic.toLowerCase()) || "jpeg".equals(pic.toLowerCase())) {
			response.setContentType("image/jpeg");
		}
		
		// 8、利用commons-io的jar包,拷贝file对象  FileUtils.copyFile(file,response.getOutputStream());
		FileUtils.copyFile(file, response.getOutputStream());
		
	}

猜你喜欢

转载自blog.csdn.net/qq_24696571/article/details/90112487