这两天遇到个需求——用户头像修改功能。
查了好多资料,不是代码不全,就是某些高端框架,卡了好久,今已实现,分享给大家,如果有更好的方法,非常感谢可以在下方评论区写出
一、整体项目架构
二、web.xml配置文件
UploadServlet
UploadServlet
com.runoob.test.UploadServlet
UploadServlet
/lianxi/UploadServlet
getImg
getImg
com.runoob.test.getImg
getImg
/lianxi/getImg
三、jar包
四、JSP文件
上传表单——upload.jsp
Insert title here选择一个文件:上传完成后的消息提示页面 + 往session中写入图片所在的存储地址————message.jsp
【可以修改为直接存到数据库中,然后同步添加至session ——方便后期直接读取图片地址,,,由于代码简单且繁杂,不属于核心,故直接用session代替,,,有需要的可以私信】
/p>
"http://www.w3.org/TR/html4/loose.dtd">
文件上传结果String logopath=(String) request.getAttribute("logopath");
session.setAttribute("headlogo",logopath);
session.setMaxInactiveInterval(2*60);%>
${message}
查看图片页面————img.jsp
查看图片五、servlet文件+字符串工具类
处理上传的servlet——UploadServlet.java
packagecom.runoob.test;importjava.io.File;importjava.io.FileInputStream;importjava.io.IOException;importjava.io.OutputStream;importjava.io.PrintWriter;importjava.util.List;importjavax.servlet.ServletException;importjavax.servlet.annotation.WebServlet;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importorg.apache.commons.fileupload.FileItem;importorg.apache.commons.fileupload.disk.DiskFileItemFactory;importorg.apache.commons.fileupload.servlet.ServletFileUpload;importcom.runoob.test.tool;/*** Servlet implementation class UploadServlet*/@WebServlet("/UploadServlet")public class UploadServlet extendsHttpServlet {private static final long serialVersionUID = 1L;//上传文件存储目录
private static final String UPLOAD_DIRECTORY = "upload";//上传配置
private static final int MEMORY_THRESHOLD = 1024 * 1024 * 3; //3MB
private static final int MAX_FILE_SIZE = 1024 * 1024 * 40; //40MB
private static final int MAX_REQUEST_SIZE = 1024 * 1024 * 50; //50MB
/*** 上传数据及保存文件*/
protected voiddoPost(HttpServletRequest request,
HttpServletResponse response)throwsServletException, IOException {//检测是否为多媒体上传
if (!ServletFileUpload.isMultipartContent(request)) {//如果不是则停止
PrintWriter writer =response.getWriter();
writer.println("Error: 表单必须包含 enctype=multipart/form-data");
writer.flush();return;
}//配置上传参数
DiskFileItemFactory factory = newDiskFileItemFactory();//设置内存临界值 - 超过后将产生临时文件并存储于临时目录中
factory.setSizeThreshold(MEMORY_THRESHOLD);//设置临时存储目录
factory.setRepository(new File(System.getProperty("java.io.tmpdir")));
ServletFileUpload upload= newServletFileUpload(factory);//设置最大文件上传值
upload.setFileSizeMax(MAX_FILE_SIZE);//设置最大请求值 (包含文件和表单数据)
upload.setSizeMax(MAX_REQUEST_SIZE);//中文处理
upload.setHeaderEncoding("UTF-8");//构造临时路径来存储上传的文件//这个路径相对当前应用的目录
String uploadPath = getServletContext().getRealPath("/") + File.separator +UPLOAD_DIRECTORY;//如果目录不存在则创建
File uploadDir = newFile(uploadPath);if (!uploadDir.exists()) {
uploadDir.mkdir();
}try{//解析请求的内容提取文件数据
@SuppressWarnings("unchecked")
List formItems =upload.parseRequest(request);if (formItems != null && formItems.size() > 0) {//迭代表单数据
for(FileItem item : formItems) {//处理不在表单中的字段
if (!item.isFormField()) {
String fileName= newFile(item.getName()).getName();
String filePath= uploadPath + File.separator +fileName;
File storeFile= newFile(filePath);//在控制台输出文件的上传路径
System.out.println(filePath); //原始路径
/*对存储的路径 调用字符串工具 修改*/tool tl = new tool();
filePath =tl.removeGang(filePath); System.out.println(filePath);//保存文件到硬盘
item.write(storeFile);
request.setAttribute("message","文件上传成功!");
request.setAttribute("logopath",filePath ); }
}
}
}catch(Exception ex) {
request.setAttribute("message","错误信息: " +ex.getMessage());
}//跳转到 message.jsp
getServletContext().getRequestDispatcher("/message.jsp").forward(
request, response);
}
}
字符串工具类——tool.java
packagecom.runoob.test;public classtool {publicString removeGang(String xx) {
xx= xx.replaceAll("\\\\", "/"); //为什么这么写?可以看下UploadServlet.java 上传图片的存储路径:xxx\xxxx\xxxxx\xxx\xx 为了将该图片从服务器中读取出来,需要通过url地址来访问,然鹅“\“是非法url编码,需要变为”/"
System.out.println(xx);returnxx;
}
}
输出图片————getImg.java
packagecom.runoob.test;importjava.io.File;importjava.io.FileInputStream;importjava.io.IOException;importjava.io.OutputStream;importjavax.servlet.ServletException;importjavax.servlet.annotation.WebServlet;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;/*** Servlet implementation class getImg*/@WebServlet("/getImg")public class getImg extendsHttpServlet {private static final long serialVersionUID = 1L;/***@seeHttpServlet#HttpServlet()*/
publicgetImg() {super();//TODO Auto-generated constructor stub
}/***@seeHttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throwsServletException, IOException {//TODO Auto-generated method stub
String pathName = request.getParameter("path"); File imgFile= newFile(pathName);
FileInputStream fin= null;
OutputStream output= null;try{
output=response.getOutputStream();
fin= newFileInputStream(imgFile);byte[] arr = new byte[1024*10];intn;while((n = fin.read(arr)) != -1) {
output.write(arr,0,n);
}
output.flush();
System.out.println("图像输出完毕");
}catch(IOException e) {
e.printStackTrace();
}try{
output.close();
}catch(IOException e) {
e.printStackTrace();
}
}/***@seeHttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throwsServletException, IOException {//TODO Auto-generated method stub
doGet(request, response);
}
}
然后就可以直接
如img.jsp
原理后期补充,先赶火车......
演示: