如何实现上传图片并保存到数据库及遇到的问题
现在由于人们的生活质量的提高及网络的发达,所以在各大软件中上传个人的头像及其他图片已成为普遍的事情,差不多所有的软件都实现了这个功能,那么他们究竟是怎么做到的呢?
其实并不难,现在我就以一个完整的例子来讲解一下。
先来看一下效果图及结构,再来看一下实现的功能的写法。
效果图:
Html:
问题1:如何实现上传图片的功能并把图片显示出来?
步骤:1、先打开file文件表单选择图片;2、创建FileReader对象 ,用正则表达式过滤图片文 件;3、利用改变事件将图片显示出来;4、读取文件,将url绑定到img标签的src属性上。
详细: 1、chooseImageFile方法:
function chooseImageFile(inputFileID) {
$("#" + inputFileID).click();
}
2、创建 FileReader 对象,用正则表达式过滤图片:
var imgReader = new FileReader();
//正则表达式 过滤图片文件
regexImageFile=/^(?:image\/jpg|image\/jpeg|image\/png)$/i;
FileReader 对象允许 Web 应用程序来异步读取存储在用户计算机上的文件里面的内容,使 用 File 或者 Blob 对象指定要读取的文件或数据,其中结合 input:file 可以很方便的读取本地文件里面的内容。
3、利用改变事件将图片显示出来:
function showImgToView(inputFileId) {
//选择图片文件
var imgFile = $("#" + inputFileId).get(0).files[0];
//判断上传文件是否为图片格式
if (!regexImageFilter.test(imgFile.type)) {
layer.msg("请选择有效的图片文件", { icon: 0, title: "提示",skin:"layui-layer-molv" });
}
else {
//将文件读取为DataURL
imgReader.readAsDataURL(imgFile);
}
}
readAsDataURL()方法是 FileReader 对象里面的方法,其作用为可以获取 API 异步读取的文件 数据,将图片另存为数据 Url,还可以实现图片上传预览的效果,让用户确认是否就是上传这张 图片,提升用户体验。
4、读取文件
imgReader.onload = function (evt) {
//将该URL绑定到img标签的src属性上,就可以实现图片的上传预览效果了。
$("#ImgCommodityPicture").attr("src", evt.target.result);
};
问题2: 如何进行提交表单数据?
给保存按钮一个点击事件,进行提交数据,再给form标签一个action行为进行提交表单数据。
//保存新增
function InsertPicture() {
$("#formCommodity").ajaxSubmit(function (returnJson) {
//保存成功
if (returnJson.State) {
//提示信息
layer.alert(returnJson.Text, { icon: 1, title: "提示" });
}
else {
layer.alert(returnJson.Text, { icon: 0, title: "提示" });
}
});
}
问题3: 如何清空图片?
//清空图片
function ClearPicture() {
$("#ImgCommodityPicture").attr("src", "");
}
问题4: 如何把图片保存到数据库?
注:在保存数据到数据库的时候我遇到了一个问题,就是虽然图片上传到了显示出来了,但是就是不可以保存到数据库,主要是fileCommodityPicture传过来的值为Null,除了单词写错之外,其实有三种可能会导致传到控制器中没有值,第一种是传到控制器的名字不能与数据库中存放图片的字段对应;第二种是传到控制器的值要与input中的name属性中的名字一致;第三种就是在form标签里面写明是用post请求(method=“post”),否则fileCommodityPicture的值无法传到控制器。
虽然看似简单,但是还是要注意细节问题。