也就是在浏览器上,上传图片并回显,效果如下

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><!--enctype属性能把文件内容封装到请求体,没有这个只能上传文件名--><form action="/day58/FileUpload"  enctype="multipart/form-data" method="post"><input type="file" name="image"><br><!--用来上传文件的标签--><input type="text" name="username">用户名<br><input type="submit"><!--把form表单内容封装到请求报文--></form>
<img src="">
</body>
</html>

上传界面对应HTML

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;import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.UnsupportedEncodingException;
import java.util.*;public class FileUploadUtils {//这是解析请求报文的函数public static Map<String, Object> parseRequest(HttpServletRequest request) {//创建生产DiskFileItem对象的工厂DiskFileItemFactory factory = new DiskFileItemFactory();//设置临时文件缓冲区,当某些上传文件过大,边上传边放入缓冲区File repository = (File) request.getServletContext().getAttribute("javax.servlet.context.tempdir");factory.setRepository(repository);//把上一步的配置放入工厂//利用factory拿到文件上传处理器ServletFileUpload upload = new ServletFileUpload(factory);//解决上传中文文件名出现乱码upload.setHeaderEncoding("utf-8");//设置允许上传的文件最大空间,单位字节,一定要在parseRequest()前设置upload.setFileSizeMax(100000);//用来存表单里的key-value,为了后面用BeanUtils把Map封装到JavaBean类里Map<String, Object> map = new HashMap<>();try {//解析请求体里的表单,每一个有name的input,对应一个FileItemList<FileItem> items = upload.parseRequest(request);Iterator<FileItem> iterator = items.iterator();while (iterator.hasNext()) {//遍历表单数据FileItem item = iterator.next();//要对普通表单数据和上传的文件区别对待if (item.isFormField()) {//这个input是普通表单数据processFormField(item, map);} else {//这个input是上传文件processUploadFile(item, map, request);}}} catch (FileUploadException e) {e.printStackTrace();}return map;}//对上传文件的处理函数private static void processUploadFile(FileItem item, Map<String, Object> map, HttpServletRequest request) {String key = item.getFieldName();//得到<input>属性name的值String fileName = item.getName();//得到文件名 1.jpg//老版edge获得的文件名是C:\Users\1.jpg,要去掉前缀,只留下1.jpgint index = fileName.lastIndexOf("\\");//找到最后一个\的下标//返回从(index+1)位置开始到结束的部分字符串fileName = fileName.substring(index + 1);//设置上传文件在服务器存储时的文件名// 为了防止重复,新文件名=随机序列+老文件名String random = UUID.randomUUID().toString();//老文件名放后面,因为文件有后缀名(.txt)fileName = random + "-" + fileName;String contentType = item.getContentType();//获得文件类型(image/jpeg)boolean isInMemory = item.isInMemory();//判断数据内容是存储在内存中,还是临时文件中,内存中返回truelong sizeInBytes = item.getSize();//返回上传文件大小(以字节为单位)//为了防止服务器收到的文件太多,顺序查找文件速度慢,要把文件分散存储int hashCode = fileName.hashCode();String hexString = Integer.toHexString(hashCode);char[] chars = hexString.toCharArray();String basePath = "image";for (char aChar : chars) {basePath = basePath + "/" + aChar;}String relativePath = basePath + "/" + fileName;//前端访问图片的相对地址//文件在存放在硬盘的绝对路径,String absolutePath = request.getServletContext().getRealPath(relativePath);File file = new File(absolutePath);if (!file.getParentFile().exists()) {//判断该文件的父目录是否存在file.getParentFile().mkdirs();//不存在就创建新的文件夹}try {item.write(file);//将文件写入磁盘map.put(key, relativePath);//或者得到数据输入流,从而读取上传数据:InputStream uploadStream = item.getInputStream();} catch (Exception e) {e.printStackTrace();}}//对于普通form表单,一般只对<input>标签的key-value感兴趣private static void processFormField(FileItem item, Map<String, Object> map) {String key = item.getFieldName();//得到<input>的key/nameString value = null;try {value = item.getString("utf-8");//防止value有中文乱码map.put(key, value);} catch (UnsupportedEncodingException e) {e.printStackTrace();}System.out.println(key + ":" + value);}
}

文件上传的工具类

import org.apache.commons.fileupload.servlet.ServletFileUpload;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 java.io.IOException;
import java.util.Map;@WebServlet("/FileUpload")
public class FileUpload1 extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {response.setContentType("text/html;charset=utf-8");//设置响应报文的编码格式为utf-8并告诉浏览器//判断前端页面有没有文件上传属性enctype="multipart/form-data"boolean isMultipart = ServletFileUpload.isMultipartContent(request);if (!isMultipart) {response.getWriter().println("有文件上传属性");}Map<String, Object> map = FileUploadUtils.parseRequest(request);//回显的操作建议写在另外一个servlet中//用context域共享map对象getServletContext().setAttribute("user", map);response.getWriter().println("上传成功,信息即将进行回显....");//2s后刷新到显示servletresponse.setHeader("refresh", "2;url=" + request.getContextPath() + "/viewshow");}}

处理文件上传的servlet

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 java.io.IOException;
import java.util.HashMap;
import java.util.Map;@WebServlet("/viewshow")
public class ViewServlet extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//解决响应报文有中文会乱码,一定要加不然图片都不能正常显示response.setContentType("text/html;charset=utf-8");Map user = (HashMap) getServletContext().getAttribute("user");response.getWriter().println("<!DOCTYPE html>\n" +"<html lang=\"en\">\n" +"<head>\n" +"    <meta charset=\"UTF-8\">\n" +"    <title>Title</title>\n" +"</head>\n" +"<body>");response.getWriter().println("<div>" + user.get("username") + "</div>");response.getWriter().println("<div><img src='" + request.getContextPath() + "/" + user.get("image") + "'></div>");response.getWriter().println("</body>\n" +"</html>");}
}

完成回显的servlet

用Java实现修改头像相关推荐

  1. 小米手机通过相册修改头像时报java.lang.SecurityException

    问题解决办法记录(好记性不如烂笔头-电子笔头,嘿嘿) Caused by: java.lang.SecurityException: UID 10764 does not have permissio ...

  2. minio服务器在win10的上传与下载,以及修改头像Minio速看免费本地文件服务器

    首先自己配置Minio服务器 和客户端 请点击 官网地址http://www.minio.org.cn 安装完成后自己百度win10安装. 我是用Spring boot 配置 首先导入 Minio D ...

  3. 仿微信修改头像,自定义相册、自定义裁剪

    最近因为项目需求需要自定义修改头像时的相册,另外调用系统裁剪经常出现无法裁剪图片的错误,所以裁剪也决定自定义,参照了这两篇文章: https://blog.csdn.net/lvshaorong/ar ...

  4. 理解和解决Java并发修改异常ConcurrentModificationException(转载)

    原文地址:https://www.jianshu.com/p/f3f6b12330c1 理解和解决Java并发修改异常ConcurrentModificationException 不知读者在Java ...

  5. rest_framework10:base64补充/修改头像

    base64补充 # base64 变长,可反解 # md5 固定长度,不可反解# base64 编码和解码 import base64 import json dic={'name':'test', ...

  6. java反射 修改静态方法的值 setAccessible

    转载自 java反射 修改静态方法的值 setAccessible 这几天闲来无事.在网上看了一个题目,相信大家都知道这个题目 static void change(String str){str=& ...

  7. JAVA反射修改常量,以及其局限

    转载自 JAVA反射修改常量,以及其局限 问题,以及一个解决方案 今天公司的JAVA项目碰到一个问题:在生成xls文件的时候,如果数据较多,会出现ArrayIndexOutOfBoundsExcept ...

  8. java日志——修改日志管理器配置+日志本地化

    [0]README 0.1) 本文描述+源代码均 转自 core java volume 1, 旨在理解 java日志--修改日志管理器配置+日志本地化 的相关知识: [1]修改日志管理器配置 1.1 ...

  9. java只修改变的字段_java注解之运行时修改字段的注解值操作

    今天遇到需求:导入Excel时候列头会发生变化,客户是大爷要求你改代码, 导入Excel是用easypoi做的,识别表头是用注解@Excel(name = "xxx")通过这个na ...

  10. java ajax 更改头像_ajax+node实现头像更改

    好久没有更新博客了,这几天在写文件上传的时候遇到了一个新的问题,就是关于ajax实现文件上传的问题 这几天在做一个小的demo,类似于论坛的一个东西,基于jquery+express+mongo的一个 ...

最新文章

  1. nginx内存占用高---内存池使用思考
  2. Apache 下更改 DocumentRoot 和新建虚拟目录
  3. Visual Studio 2015价格大幅下调
  4. split函数python_Python字符串split函数知多少【Python每日一个知识点第75期】
  5. HBase读写操作流程介绍
  6. python错误处理
  7. (15)ZYNQ FPGA AXI-stream总线简介(学无止境)
  8. (90)FPGA比较器设计
  9. WebServices SOAP简单介绍
  10. 软件基本功:以视频通话为例,交叉测试表格
  11. java中HashSet实现(转)
  12. js调用摄像头拍照,js调用摄像头在线拍照,js调用电脑摄像头拍照
  13. 开发一款AirPods或者Beats耳机查看电量的软件
  14. 内含干货PPT下载|一站式数据管理DMS关键技术解读
  15. 调试经验——Win 10 Excel中Alt+Tab不能切换窗口的解决方法
  16. 量化基金投资之套利策略简介
  17. SMAA算法详解 - SMAAEdgeDetectionVS
  18. 超级简单的 RocketMQ 流量削峰实战
  19. 单人扑克游戏:地城恶棍的Python实现(附实现代码)
  20. 利用Nginxcp为cPanel/WHM服务器开启nginx支持

热门文章

  1. 思科模拟器路由器常见问题及操作记录
  2. linux离线安装flex,Flexbuilder 3在Linux下安装
  3. FlexBuilder安装和HelloWorld例子
  4. 如何给linux添加新硬盘(转)
  5. wifi上行下行速度测试_测试网速_测试网速wifi在线测试
  6. 什么是驻点和拐点_拐点和驻点的区别有哪些
  7. 游戏建模赏析:《魔兽世界》伊瑟拉图鉴
  8. Lomboz插件的介绍 下载 安装 问题
  9. IE白屏修复,vue 兼容IE
  10. _ie6png图片的修复