java jsp filename filepath 图片上传_JSP+java上传图片到服务器,并将地址保存至MYSQL + JSP网页显示服务器的图片...

本文介绍了如何使用Java JSP实现用户头像上传到服务器,并将图片地址保存到session,同时在JSP页面展示上传的图片。详细步骤包括项目架构、web.xml配置、JSP文件、Servlet处理上传和图片读取方法。
摘要由CSDN通过智能技术生成

这两天遇到个需求——用户头像修改功能。

查了好多资料,不是代码不全,就是某些高端框架,卡了好久,今已实现,分享给大家,如果有更好的方法,非常感谢可以在下方评论区写出

一、整体项目架构

8dab756998051959781d2feaea693464.png

二、web.xml配置文件

UploadServlet

UploadServlet

com.runoob.test.UploadServlet

UploadServlet

/lianxi/UploadServlet

getImg

getImg

com.runoob.test.getImg

getImg

/lianxi/getImg

三、jar包

860f227e3c517afc736ade97579fe85c.png

四、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

查看图片

getImg?path=<%=imgPath%20%>

五、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;

}

}

ef0ed1618dbca972bc20615ac0afcbcd.png

输出图片————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);

}

}

然后就可以直接getImg?path=%E5%AD%98%E5%82%A8%E8%B7%AF%E5%BE%84

如img.jsp

原理后期补充,先赶火车......

演示:

f9932b077b98fc86175b08d64b1ea2d3.png

2ddfce2bd361938532408a7107669bf4.png

add4d545d25300166e708fcd2453dbe7.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值