图片上传预览

图片上传预览

使用云盘存储路径<七牛云>

原理:点击上传图片时,访问接口使用七牛云的工具类把图片上传到七牛云空间,同时返回图片名称,上传成功后调用ElementUI的钩子函数,实现图片预览
缺点:会产生垃圾数据,要定时清理
<1>上传文件时的前端页面ElementUI
提示更改:action="****"

<el-row>
	<el-col :span="24">
		<el-form-item label="上传图片">
			<el-upload
					class="avatar-uploader"//样式
					action="****"//上传时的访问Controller路径--/xxxxx/upload.do
					:auto-upload="autoUpload"//是否自动上传--true
					name="imgFile"//图片名字imgFile
					:show-file-list="false"//是否展示上传列表
					:on-success="handleAvatarSuccess"//上传成功执行的方法
					:before-upload="beforeAvatarUpload">//上传前可以校验是否合格
				//判断图片访问地址imageUrl是否为null
				<img v-if="imageUrl" :src="imageUrl" class="avatar">//!=null
				<i v-else class="el-icon-plus avatar-uploader-icon"></i>//==null
			</el-upload>
		</el-form-item>
	</el-col>
</el-row>

<2>js–Vue
提示更改:el: ‘#***’,this.imageUrl="<协议>–<域名>"+response.data;

var vue = new Vue({
        el: '#***',
        data: {
       	 	autoUpload:true
            imageUrl: null,//模型数据,用于上传图片完成后图片预览,初始值为null
            formData: {},//需要提交的表单数据
        },
        methods: {
//文件上传成功后的钩子,response为服务端返回的值,file为当前上传的文件封装成的js对象
            handleAvatarSuccess(file,filesList) {
            	//访问路径路径可变---域名+文件名称
                this.imageUrl="<协议>--<域名>"+response.data;
                this.$message({
                    type:response.flag?"success":"error",
                    message:response.message
                })
                //给formData对象添加属性,传输图片名称
                this.formData.img=response.data
            },
            //上传图片之前执行
            beforeAvatarUpload(file) {
                const isJPG = file.type === 'image/jpeg';
                const isLt2M = file.size / 1024 / 1024 < 2;
                if (!isJPG) {
                    this.$message.error('上传套餐图片只能是 JPG 格式!');
                }
                if (!isLt2M) {
                    this.$message.error('上传套餐图片大小不能超过 2MB!');
                }
                return isJPG && isLt2M;
            },
		}
    })

<3>后端上传图片

    @RequestMapping("/upload")
    //(@RequestParam("****)前端文件提交时的name属性和后端MultipartFile参数名不同时必须添加此属性(***)为前端文件的name值,此处可以不添加
    //Result是一个--被序列化--的实体类用来--封装返回结果
    //MultipartFile  这个类一般是用来接受前台传过来的文件
    public Result upload(@RequestParam("imgFile") MultipartFile imgFile) {
        try {
        	//获取文件名 MultipartFile 的API
            String originalFilename = imgFile.getOriginalFilename();
            //获取最后一个·所在位置的索引
            int lastIndexOf = originalFilename.lastIndexOf(".");
            //返回一个新字符串,它是此字符串的一个子字符串。该子字符串始于指定索引处的字符,一直到此字符串末尾。
            String suffix = originalFilename.substring(lastIndexOf);
            //使用UUID
            String fileName = UUID.randomUUID().toString() + suffix;
            //使用七牛云的工具类,上传文件
            QiniuUtils.upload2Qiniu(imgFile.getBytes(), fileName);   
            //把生成的图片名称存储到Redis中        
			jedisPool.getResource().sadd(RedisConstant.SETMEAL_PIC_RESOURCES,fileName);
			//页面回显fileName用来和域名结合实现图片预览
            return new Result(true, MessageConstant.PIC_UPLOAD_SUCCESS, fileName);
        } catch (IOException e) {
            e.printStackTrace();
            return new Result(false, MessageConstant.PIC_UPLOAD_FAIL);
        }
    }

<4>七牛云和Redis定时清理使用详见下一篇

创建临时的路径来展示图片

原理:点击上传图片时,访问接口直接把图片存储到本地磁盘,同时返回图片名称,上传成功后调用ElementUI的钩子函数,实现图片预览
<1>上传文件时的前端页面ElementUI

<el-row>
	<el-col :span="24">
		<el-form-item label="上传图片">
			<el-upload 
					class="avatar-uploader"
 					action=""//上传后不需要去存储
					:auto-upload="autoUpload"//是否自动上传--false
					name="imgFile"//图片传输的名字
					:show-file-list="false"//是否展示上传列表
					:on-change="onchange"//图片上传成功或者失败都会执行
					:before-upload="beforeAvatarUpload">//上传前可以校验是否合格
				//判断图片访问地址imageUrl是否为null
				<img v-if="imageUrl" :src="imageUrl" class="avatar">//!=null
 				<i v-else class="el-icon-plus avatar-uploader-icon"></i>//==null
			</el-upload>
		</el-form-item>
	</el-col>
</el-row>

<2>js–Vue
提示更改:el: ‘#***’
创建临时的路径来展示图片获取文件名称拼接图片预览路径
FormData类型其实是在XMLHttpRequest 2级定义的,它是为序列化表以及创建与表单格式相同的数据(当然是用于XHR传输)提供便利。
方法源码:append(name: string, value: string | Blob, fileName?: string): void;
Blob(Binary Large Object)术语最初来自数据库(oracle 中也有类似的栏位类型。),早期数据库因为要存储声音、图片、以及可执行程序等二进制数据对象所以给该类对象取名为Blob。

 var vue = new Vue({
        el: '#***',
        data: {
            autoUpload: false,//自动上传
            imageUrl: null,//模型数据,用于上传图片完成后图片预览
            param:"",//
            formData: {},//表单数据
        },
        methods: {
            //文件上传成功后的钩子,response为服务端返回的值,file为当前上传的文件封装成的js对象
            onchange(file,filesList) {
                //获取window.URL对象
                var windowURL = window.URL || window.webkitURL;
                //创建临时的路径来展示图片获取文件名称拼接图片预览路径
                this.imageUrl=windowURL.createObjectURL(file.raw);
         		this.param=new FormData();
         	    this.param.append('file', file.raw, file.name);
        },
            //上传图片之前执行
            beforeAvatarUpload(file) {
                const isJPG = file.type === 'image/jpeg';
                const isLt2M = file.size / 1024 / 1024 < 2;
                if (!isJPG) {
                    this.$message.error('上传套餐图片只能是 JPG 格式!');
                }
                if (!isLt2M) {
                    this.$message.error('上传套餐图片大小不能超过 2MB!');
                }
                return isJPG && isLt2M;
            },
            //添加
            handleAdd () {
            //指定表单类型
                    let config = {
                        headers: {
                            'Content-Type': 'multipart/form-data'
                        }
                    };
         //添加表单数据
                    this.param.append("name",this.formData.name);
                    this.param.append("code",this.formData.code);
                   .....

                    axios.post("/*****/add1.do?Ids=" + this.Ids,this.param,config).then((res)=>{
                    this.dialogFormVisible=false;
                        if(res.data.flag){
                            this.$message({
                                type:'success',
                                message:res.data.message
                            })
                        } else{
                            this.$message.error(res.data.message);
                        }
                    })
                }
        }
    })

<3>后端代码实现

@RequestMapping("/add1")
    public Result add1(Setmeal setmeal,Integer [] Ids,@RequestParam("file")MultipartFile imgFile) throws IOException {
    //获取文件初始名称
  String originalFilename = imgFile.getOriginalFilename ();
  //本地存储,地址可换
  imgFile.transferTo ( new File ( "E:\\temp\\" + originalFilename ) );
   try {
   //返回结果
            return new Result ( true, MessageConstant.ADD_***_SUCCESS );
        } catch (Exception e) {
            e.printStackTrace ();
            return new Result ( false, MessageConstant.ADD_****_FAIL );
        }
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值