Java-实现上传图片功能

涎涎原创约 1052 字大约 4 分钟...JavaJava

Java-实现上传图片功能

注意

本博文仅供学术研究和交流参考,严禁将其用于商业用途。如因违规使用产生的任何法律问题,使用者需自行负责。

  1. 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>
  1. 在WebContent目录下创建photos文件夹

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

  1. 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;
	}
}
  1. 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