javaweb上传图片存到本地,并存储地址到数据库
前端使用layui的图片上传,将文件base64编码,然后在后端使用转码类来操作base64编码,并保存图片到本地,继而获取文件地址,将文件地址保存到数据库中
1.使用layui的图片上传
infoset.jsp
layui.use('upload', function() {
var $ = layui.jquery;
var upload = layui.upload;
//普通图片上传
var uploadInst = upload.render({
elem: '#test1',
//根据id上传图片
url: 'http://localhost:8080/user?method=updateUserPhoto&id='+id, //改成您自己的上传接口
method: 'post' , //可选项。HTTP类型,默认post
auto: false, //选择文件后不自动上传
bindAction: '#ListAction' ,//指向一个按钮触发上传
choose: function(obj){
//将每次选择的文件追加到文件队列
var files = obj.pushFile();
//预读本地文件,如果是多文件,则会遍历。(不支持ie8/9)
obj.preview(function(index, file, result) {
console.log(index); //得到文件索引
console.log(file); //得到文件对象
console.log(result); //得到文件base64编码,比如图片
$('#demo1').attr('src', result); //图片链接(base64)
$.post("http://localhost:8080/user?method=updatePhoto", {result:result,id:id}, function(res) {
console.log("updatePhoto请求成功");
}, "text");//这里用的是post提交,如果不懂可以参考JQuery中ajax提
})
},
done: function(res) {
//如果上传失败
if (res.code > 0) {
return layer.msg('上传失败');
}
//上传成功
},
error: function() {
//演示失败状态,并实现重传
var demoText = $('#demoText');
demoText.html('<span style="color: #c158ff;">上传失败</span> <a class="layui-btn layui-btn-xs demo-reload">重试</a>');
demoText.find('.demo-reload').on('click', function() {
uploadInst.upload();
});
}
});
});
2.后端使用编码类转码,保存图片到本地
UserServlet
String basedata=req.getParameter("result");
Integer useridtwo = Integer.parseInt(req.getParameter("id"));
System.out.println("UserServlet中使用方法updatePhoto获取数据为:" + basedata);
String position=PhotoUtils.GenerateImage(basedata,"reader");
//通过id存储地址
Reader readertwo = userService.findUserById(useridtwo);
//传递两个参数去取代返回值为是否成功保存地址
if (userService.updatePhoto(readertwo,position) == 1) {
System.out.println("updatePhoto数据更新成功");
}
PhotoUtils
import org.apache.commons.fileupload.FileItem;
import sun.misc.BASE64Decoder;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.util.Date;
public class PhotoUtils {
//base64字符串转化成图片
public static String GenerateImage(String imgStr,String wenjian)
{
System.out.print("已经收到了把字节码转化为图片的方法");
//对字节数组字符串进行Base64解码并生成图片
if (imgStr == null) //图像数据为空
return "error";
//解析base64码,获取图片格式
String str [] = imgStr.split(",");
imgStr = str[1];
String imgInfo = str[0];
String imgExt = imgInfo.split("/")[1].split(";")[0];
// String imgExt="gif";
BASE64Decoder decoder = new BASE64Decoder();
try
{
//Base64解码
byte[] b = decoder.decodeBuffer(imgStr);
for(int i=0;i<b.length;++i)
{
if(b[i]<0)
{//调整异常数据
b[i]+=256;
}
}
String imgFileReturn= "http://localhost:8080/image/"+getPhotoNewName(imgExt,wenjian);
String imgFilePath = "E:\\JavaProject\\bookManage\\web\\image\\"+"\\"+getPhotoNewName(imgExt,wenjian);//新生成的图片
// String imgFilePath = "E:\\image\\"+"\\"+getPhotoNewName(imgExt,wenjian);//新生成的图片
System.out.println(imgFilePath);
OutputStream out = new FileOutputStream(imgFilePath);
out.write(b);
out.flush();
out.close();
return imgFileReturn;
}
catch (Exception e)
{
return "";
}
}
/**
*这个函数的功能是获取当前时间点与1970年的间隔秒数
*/
public static int getSecondTimestamp(Date date){
if (null == date) {
return 0;
}
String timestamp = String.valueOf(date.getTime());
System.out.println(timestamp);
int length = timestamp.length();
if (length > 3) {
return Integer.valueOf(timestamp.substring(0,length-3));
} else {
return 0;
}
}
/**
*
*这个函数的功能是得到新的照片名称
*/
public static String getPhotoNewName(String imgExt,String wenjian) {
Date date=new Date();
int second=getSecondTimestamp(date);
String fileName=wenjian+String.valueOf(second)+"."+imgExt;
return fileName;
}
}
ReaderRepositoryImpl
@Override
public Reader findUserById(int id) {
//之前定义的包装类用于c3p0连接池的使用
Connection connection = JdbcTools.getConnection();
String sql = "select * from reader where id=?";
//执行sql语句
PreparedStatement statement = null;
ResultSet resultSet = null;
Reader reader = null;
try {
statement = connection.prepareStatement(sql);
//参数代替问号
statement.setInt(1,id);
resultSet = statement.executeQuery();
if (resultSet.next()) {
//单个数据的替代,
reader = new Reader(resultSet.getInt(1), resultSet.getString(2), resultSet.getString(3), resultSet.getString(4), resultSet.getString(5), resultSet.getString(6), resultSet.getString(7), resultSet.getInt(8), resultSet.getString(10));
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
JdbcTools.release(connection, statement, resultSet);
}
return reader;
}
javaweb上传图片存到本地,并存储地址到数据库的更多相关文章
- Android之ListView,AsyncTask,GridView,CardView,本地数据存储,SQLite数据库
版权声明:未经博主允许不得转载 补充 补充上一节,使用ListView是用来显示列表项的,使用ListView需要两个xml文件,一个是列表布局,一个是单个列表项的布局.如我们要在要显示系统所有app ...
- java web应用用户上传图片的存储地址
原来工程的上传图片存储地址在web应用的目录下,并且是硬编码到其中的: 每次使用maven tomcat:redeploy以后,这个目录就没有了. 现在想要把上传图片的位置移动到tomcat的weba ...
- java上传图片,把图片存到本地
思路:js通过FileReader获取图片的Base64,Java解码用IO存到本地. HTML 代码 <input type="file" ng-model="f ...
- ueditor上传图片到七牛云存储(form api,java)
转:http://my.oschina.net/duoduo3369/blog/174655 ueditor上传图片到七牛云存储 ueditor结合七牛传图片 七牛的试炼 开发前的准备与注意事项说明 ...
- iOS APP之本地数据存储(译)
最近工作中完成了项目的用户信息本地存储,查阅了一些本地存储加密方法等相关资料.期间发现了一个来自印度理工学院(IIT)的信息安全工程师的个人博客,写了大量有关iOS Application secur ...
- IOS开发-本地持久化存储sqlite应用
前言 需求描述 开发测试环境 FMDB介绍 创建工程 一.前言 上一章介绍了如何开发一个IOS应用的入门案例教程: 我的第一个IOS开发应用 本章主要将介 ...
- iOS开发技术分享(1)— iOS本地数据存储
iOS开发技术分享(1)— iOS本地数据存储 前言: 我本是一名asp.net程序员,后来加入了iOS游戏开发队伍,到现在也有一年多的时间了.这一年来,每天都干到2.3点钟才睡觉,不为别的,只为了学 ...
- 浏览器本地数据存储解决方案以及cookie的坑
本地数据存储解决方案以及cookie的坑 问题: cookie过长导致页面打开失败 背景: 在公司的项目中有一个需求是打开多个工单即在同一个页面中打开了多个tab(iframe),但是需要在刷新时只刷 ...
- Unity本地数据存储---Sqlite和JSON
2014-05-04更新 SqliteDatabase.cs这个文件的初始方法有问题,具体是如果指定URL已经存在了DB文件,就不会重新覆盖DB文件. 这导致我们修改之后的DB文件无法产生效果. 本人 ...
- 本地数据存储解决方案以及cookie的坑
本地数据存储解决方案以及cookie的坑 问题: cookie过长导致页面打开失败 背景: 在公司的项目中有一个需求是打开多个工单即在同一个页面中打开了多个tab(iframe),但是需要在刷新时只刷 ...
随机推荐
- vscode开发uniapp
VS Code 对 TS 类型支持友好,前端开发者主流的编辑器 HbuilderX 对 TS 类型支持暂不完善,期待官方完善 工作区禁用 Vetur 插件(Vue2 插件和 Vue3 插件冲突) 工作 ...
- 全网首一份!你最需要的PPTP MS-CHAP V2 挑战响应编程模拟计算教程!代码基于RFC2759,附全部源码!
本文基于网络密码课上的实验 本来想水一水就过去,代码就网上找找,不行就GPT写,但是!一份都找不到,找到的代码都是跑不了的,总会是就是乱七八糟.所以准备认真的写一份. 代码编译成功的前提是要预先装好o ...
- linux curl命令的重要用法:发送GET/POST请求,获取网页内容
curl是一个利用URL规则在命令行下工作的文件传输工具,可以说是一款很强大的http命令行工具.它支持文件的上传和下载,是综合 传输工具,但按传统,习惯称url为下载工具. #使用curl发送GET ...
- Linux间进程通信--消息队列
本系列文章主要是学习记录Linux下进程间通信的方式. 常用的进程间通信方式:管道.FIFO.消息队列.信号量以及共享存储. 参考文档:<UNIX环境高级编程(第三版)> 参考视频:Lin ...
- react mock数据
为什么要做假数据,因为后端开发接口没有哪么快,此时就需要自己来模拟请求数据. 模拟的数据字段,需要和后端工程师沟通. 创建所需数据的json文件 json-server 此命令可以帮助我们快速创建一个 ...
- IceRPC之依赖注入>快乐的RPC
作者引言 很高兴啊,我们来到了IceRPC之依赖注入>快乐的RPC,基础引导,打好基础,才能让自已不在迷茫,快乐的畅游世界. 依赖注入和IceRPC 了解 IceRPC (C#) 如何为依赖注入 ...
- windows 右键菜单编辑/删除
windows 右键菜单编辑/删除.WIN7,WIN8,WIN10,WIN11. 在 https://www.sordum.org/7615/easy-context-menu-v1-6/ 页面底部下 ...
- es6.6.1 索引的增加,查询,修改,删除
1.新增 test2/user2/1/_create PUT操作{"name":"qiqi","age":17} 2.查询 test2/us ...
- MySQL where 操作符
MySql WHERE 操作符号 前言 在 WHERE 子句中,你可以使用任何条件对记录进行过滤. 准备工作 准备 users 表,并插入数据 # 创建用户表 users create table u ...
- QQ、支付宝、微信收款码三合一
Tips:当你看到这个提示的时候,说明当前的文章是由原emlog博客系统搬迁至此的,文章发布时间已过于久远,编排和内容不一定完整,还请谅解` QQ.支付宝.微信收款码三合一 日期:2018-8-24 ...