JAVA实现网页上传头像
大概实现就是在页面嵌入一个file类型的input控件,并且将之隐藏,点击上传传递到这个控件上面,选择文件,将图片以base64的方式传递到后台,后台解码器解码,保存图片,并且把图片名字保存到数据库或者直接把图片转为byte数组存到数据库,数据库接收类型为binary。
这里我就介绍第一种办法将图片保存到本地的方式。
1.前台input控件的代码,这里设置accept表示只接受图片类型的文件。
<input type="file" name="fileToUpload" id="fileToUpload" onchange="openFile(event)" style="display:none;" accept="image/*">
</form>
2.onchange方法则为选择文件时候触发的方法。正常流程应该是不触发onchange方法,而是选择了图片的时候,应该有个上传按钮,在执行相关事件,我这里的做法其实就是选择了图片就会进行上传,这里可以根据个人的需求进行修改。js中onchange所执行的方法。将图片转换为base64编码,利用Ajax传到后台。
var openFile = function (event) {
var input = event.target;
var reader = new FileReader();
reader.onload = function () {
var database64 = getBase64Image(reader.result);
$.ajax({
url: "user/updateheadimg.do",
type: "POST",
data: { "imgdatabase": database64,"userid":$("#loginuserid").html()},
success: function (data) {
$("#headpng").html(data);
}
});
};
reader.readAsDataURL(input.files[0]);
};
function getBase64Image(imgElem) {
return imgElem.replace("/^data:image\/(jpeg|jpg);base64,/", "");
}
3.后台接收到图片的base64编码,进行解码,保存图片到项目本地,保存图片路径到数据库。
@RequestMapping("updateheadimg")
public ModelAndView updateMyHeadImg(String imgdatabase,String userid){
ModelAndView mav=new ModelAndView();
if(imgdatabase==null){
}
int a=imgdatabase.indexOf("base64");
HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();
String path=request.getSession().getServletContext().getRealPath("");
imgdatabase=imgdatabase.substring(a+7);
BASE64Decoder decoder=new BASE64Decoder();
byte[] imgbyte;
try {
imgbyte = decoder.decodeBuffer(imgdatabase);
SAXReader reader=new SAXReader();
Document doc=reader.read(path+"\\WEB-INF\\classes\\headId.xml");
Element root=doc.getRootElement();
int headImgId=Integer.parseInt(root.getTextTrim());
OutputStream os=new FileOutputStream(new File(path+"\\headImg\\"+headImgId+".png"));
root.setText(""+(headImgId+1));
UtilTool.SaveToXml(doc,new File(path+"\\WEB-INF\\classes\\headId.xml"));
os.write(imgbyte,0, imgbyte.length);
userService.insetUserHead(headImgId+".png", userid);//头像写入数据库
os.close();
mav.addObject("imgsrc", headImgId+".png");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
mav.setViewName("headimg");
return mav;
}
4.图片名字我写在了headId.xml配置文件中并且每次保存了都+1处理,写在配置文件是保证了数据持久化,不会出现重名图片。
<?xml version="1.0" encoding="UTF-8"?>
<headid>
1
</headid>
个人认为,将图片以二进制的方式保存到数据库更为合理方便,大家可以自己试一试,有空我也会贴出第二种方式的代码。
JAVA实现网页上传头像的更多相关文章
- 《手把手教你》系列技巧篇(五十四)-java+ selenium自动化测试-上传文件-中篇(详细教程)
1.简介 在实际工作中,我们进行web自动化的时候,文件上传是很常见的操作,例如上传用户头像,上传身份证信息等.所以宏哥打算按上传文件的分类对其进行一下讲解和分享. 2.为什么selenium没有提供 ...
- 《手把手教你》系列技巧篇(五十五)-java+ selenium自动化测试-上传文件-下篇(详细教程)
1.简介 在实际工作中,我们进行web自动化的时候,文件上传是很常见的操作,例如上传用户头像,上传身份证信息等.所以宏哥打算按上传文件的分类对其进行一下讲解和分享. 2.为什么selenium没有提供 ...
- Android基础之——startActivityForResult启动界面并返回数据,上传头像
在android应用的开发过程中,常常会出现启动一个界面后填写部分内容后带着数据返回启动前的界面,最典型的应用就是登录过程.在非常多应用程序的模块中,都有"我的"这个模块,在未登录 ...
- 上传头像,layui上传图片
layui上传与bootstrap上传相似,只是不需要下插件, layui自带的已够用 先看一下前台界面,这里是用到的上传头像 先点击开始上传,头像上传至服务器中, 返回json添加至form表单中, ...
- python 全栈开发,Day86(上传文件,上传头像,CBV,python读写Excel,虚拟环境virtualenv)
一.上传文件 上传一个图片 使用input type="file",来上传一个文件.注意:form表单必须添加属性enctype="multipart/form-data ...
- Java Servlet图片上传至指定文件夹并显示图片
在学习Servlet过程中,针对图片上传做了一个Demo,实现的功能是:在a页面上传图片,点击提交后,将图片保存到服务器指定路径(D:/image):跳转到b页面,b页面读取展示绝对路径(D:/ima ...
- 《手把手教你》系列技巧篇(五十三)-java+ selenium自动化测试-上传文件-上篇(详细教程)
1.简介 在实际工作中,我们进行web自动化的时候,文件上传是很常见的操作,例如上传用户头像,上传身份证信息等.所以宏哥打算按上传文件的分类对其进行一下讲解和分享. 2.为什么selenium没有提供 ...
- swift上传头像
很久没有写博客了,今天特地写了这个,也是一边仿照别人写的demo,注释部分都是需要的.需要的同学可以参考一下. @IBAction func headImageBtnPage(){ //上传头像 / ...
- java进行文件上传,带进度条
网上看到别人发过的一个java上传的代码,自己写了个完整的,附带源码 项目环境:jkd7.tomcat7. jar包:commons-fileupload-1.2.1.jar.commons-io-1 ...
随机推荐
- Java I/O---添加属性和有用的接口—FilterlnputStream&FilterOutputStream
0.装饰器模式 Java I/O类库需要多种不同功能的组合,这正是使用装饰器模式的理由所在.这也是Java I/O类库里存在filter(过滤器)类的原因所在,抽象类filter是所有装饰器类的基类. ...
- scala写算法-List、Stream、以及剑指Offer里部分题目基于scala解法
Stream(immutable) Stream是惰性列表.实现细节涉及到lazy懒惰求值.传名参数等等技术(具体细节详见维基百科-求值策略). Stream和List是scala中严格求值和非严格求 ...
- Linux 学习记录 五(软件的安装升级).
一.gcc gcc是Linux上面最标准的C语言的编译程序,用来源代码的编译链接. gcc -c hello.c 编译产生目标文件hello.o gcc -O hello.c 编译产生目标文件,并进行 ...
- headfirst设计模式(4)—工厂模式
开篇 天天逛博客园,就是狠不下心来写篇博客,忙是一方面,但是说忙能有多忙呢,都有时间逛博客园,写篇博客的时间都没有?(这还真不好说) 每次想到写一篇新的设计模式,我总会问自己: 1,自己理解了吗? 2 ...
- python:发送消息给微信企业号
# -*- coding:utf-8 -*- import requests import json ''' 基础环境:微信企业号 version:python 2.7 ''' class Send_ ...
- 跟我一起读postgresql源码(七)——Executor(查询执行模块之——数据定义语句的执行)
1.数据定义语句的执行 数据定义语句(也就是之前我提到的非可优化语句)是一类用于定义数据模式.函数等的功能性语句.不同于元组增删査改的操作,其处理方式是为每一种类型的描述语句调用相应的处理函数. 数据 ...
- 队列详解及java实现
导读 栈和队列是有操作限制的线性表. 目录 1.队列的概念.特点.存储结构. 2.栈队列的java实现. 概念 队列是一种在一端进行插入,而在另一端进行删除的线性表.1.队列的插入端称为队尾:队列的删 ...
- python打开一个本地目录文件路径
os.path.abspath()os 模块为 python 语言标准库中的 os 模块包含普遍的操作系统功能.主要用于操作本地目录文件.path.abspath()方法用于获取当前路径下的文件. 比 ...
- 在macOS上通过pyenv安装和切换多版本Python
1. 安装homebrew 官网 http://brew.sh/index_zh-cn.html 打开终端,在终端中粘贴如下脚本 /usr/bin/ruby -e "$(curl -fsSL ...
- numpy库常用基本操作
NumPy数组的维数称为秩(rank),一维数组的秩为1,二维数组的秩为2,以此类推.在NumPy中,每一个线性的数组称为是一个轴(axes),秩其实是描述轴的数量.比如说,二维数组相当于是一个一维数 ...