Java-实现上传图片功能
原创约 1052 字大约 4 分钟...
Java-实现上传图片功能
注意
本博文仅供学术研究和交流参考,严禁将其用于商业用途。如因违规使用产生的任何法律问题,使用者需自行负责。
- userinfo_edit.jsp核心代码
<table width="90%" border="0" cellpadding="0" cellspacing="0">
<tr>
<td height="15"></td>
</tr>
<tr>
<td height="7" align="center" class="text_cray">上传照片</td>
</tr>
<tr>
<td height="8"></td>
</tr>
<tr>
<td align="center">
<input name="uploadFile" type="file" class="text_cray" size="20" />
<input type="button" value="上传" id="btn_uploadFile" style="position: relative;top: -21px;left: 70px;"/>
</td>
</tr>
</table>
<script>
document.querySelector("#btn_uploadFile").onclick = () => {
//表单提交,上传照片,告诉我是成功还是失败,最好回显照片
//1.获取表单元素
let form = document.querySelector("#edit_form");
//2.修改表单的属性:支持进行二进制数据的提交
form.encoding = "multipart/form-data";
//3.指定处理上传图片请求的servlet
form.action = "UploadPhotoServlet";
//4.表单提交
form.submit();
//以下代码将表单属性还原
//需要修改表单的enctype属性,js中的代码如下:
form.encoding = "application/x-www-form-urlencoded";
form.action = "UpdateUserServlet";
}
</script>
- 在WebContent目录下创建photos文件夹



注 若不创建则会报如下错误:

- UploadPhotoServlet
package net.ptcs.my12306.controller;
import java.io.File;
import java.io.IOException;
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.HttpSession;
import javax.servlet.http.Part;
import net.ptcs.my12306.entity.Users;
import net.ptcs.my12306.service.UserService;
/**
* Servlet implementation class UploadPhotoServlet
*/
@WebServlet(description = "负责处理 上传照片的Servlet", urlPatterns = { "/UploadPhotoServlet" })
@MultipartConfig
public class UploadPhotoServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/*
* 1.后台使用servlet3.0技术上传照片
* 2.上传照片需要指定服务器上照片保存的地址,photos文件夹保存照片
* 3.所以要拿到照片的存储路径,方便回显数据
*/
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
// 存储路径
String savePath = request.getServletContext().getRealPath(
"/photos");
System.out.println("savePath:"+savePath);
// 获取上传的文件集合
//Collection<Part> parts = request.getParts();
// 上传单个文件
// Servlet3.0将multipart/form-data的POST请求封装成Part,通过Part对上传的文件进行操作。
// Part part = parts[0];//从上传的文件集合中获取Part对象
Part part = request.getPart("uploadFile");// 通过表单file控件(<input type="file"
// name="file">)的名字直接获取Part对象
// Servlet3没有提供直接获取文件名的方法,需要从请求头中解析出来
// 获取请求头,请求头的格式:form-data; name="file"; filename="snmp4j--api.zip"
String header = part.getHeader("content-disposition");
// 获取文件名
String fileName = getFileName(header);
System.out.println("fileName:"+fileName);
// 把文件写到指定路径
//UUID.randomUUID()+".jpg"
part.write(savePath + File.separator + fileName);
//把这个照片路径保存到数据库
HttpSession session=request.getSession();
Users user=(Users)session.getAttribute("user");
UserService.getInstance().saveImage(user.getId(),fileName);
//回到更新用户信息页面,让用户看到自己的照片
response.sendRedirect("ToUpdateUserServlet");
/*PrintWriter out = response.getWriter();
out.println("上传成功");
out.flush();
out.close();
*/
}
/**
* 根据请求头解析出文件名 请求头的格式:火狐和google浏览器下:form-data; name="file";
* filename="snmp4j--api.zip" IE浏览器下:form-data; name="file";
* filename="E:\snmp4j--api.zip"
*
* @param header
* 请求头
* @return 文件名
*/
public String getFileName(String header) {
/**
* String[] tempArr1 =
* header.split(";");代码执行完之后,在不同的浏览器下,tempArr1数组里面的内容稍有区别
* 火狐或者google浏览器下:
* tempArr1={form-data,name="file",filename="snmp4j--api.zip"}
* IE浏览器下:tempArr1={form-data,name="file",filename="E:\snmp4j--api.zip"}
*/
System.out.println("header:"+header);
String[] tempArr1 = header.split(";");
/**
* 火狐或者google浏览器下:tempArr2={filename,"snmp4j--api.zip"}
* IE浏览器下:tempArr2={filename,"E:\snmp4j--api.zip"}
*/
System.out.println("tempArr1:"+tempArr1);
String[] tempArr2 = tempArr1[2].split("=");
// 获取文件名,兼容各种浏览器的写法
System.out.println("tempArr2:"+tempArr2);
String fileName = tempArr2[1].substring(tempArr2[1].lastIndexOf("\\") + 1).replaceAll("\"", "");
System.out.println("fileName:"+fileName);
return fileName;
}
}
- UpdateServlet
package net.ptcs.my12306.controller;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class UpdateServlet
*/
@WebServlet("/UpdateServlet")
public class UpdateServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
@Override
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String id=request.getParameter("id");
String realname=request.getParameter("realname");
System.out.println(id+","+realname);
//重定向到ToUpdateUserServlet即可
response.sendRedirect("ToUpdateUserServlet");
}
}
结果演示
其上传的图片在Tomcat服务器项目目录的photos文件夹内

分割线
相关信息
以上就是我关于 Java-实现上传图片功能 知识点的整理与总结的全部内容,希望对你有帮助。。。。。。。
Powered by Waline v2.15.4