上传图片的本地预览

本文介绍了一种实现图片上传及本地预览的方法,并提供了一个压缩上传的示例。包括使用HTML与JavaScript进行文件选择、预览及压缩处理的技术细节。

上传图片的本地预览

<input type="file" id='uploadImg'>
<img src="" alt="" class="imgShow">

这里写图片描述

//上传图片本地预览
        $('#uploadImg').on('change',function(){
            var file = $(this)
            var fileObj = file[0];  //获取当前元素
            var dataURL;
            var windowURL = window.URL;
            if(fileObj.files[0]){
                dataURL = windowURL.createObjectURL(fileObj.files[0])   //创建一个新的对象URL,该对象URL可以代表某一个指定的File对象或Blob对象.
                $('.imgShow').attr('src',dataURL);
            }
            else{
                dataURL = file.val();
                console.log(dataURL)
                $('.imgShow').style.filter = 'progid:DXImageTransform.Micsoft.AlphaImageLoader(sizingMethod = scale)'
                $('.imgShow').filters.item('DXImageTransform.Microsoft.AlphaImageLoader').src = dataURL;
            }
            $.ajaxFileUpload({
             url:"",
             fileElementId: "uploadImg",
             dataType: "string",
             success: function(data) {
                 //图片路径
                 $('.imgShow').attr("src",data);
             }
         });

        })

上传图片本地预览 + 压缩上传

<input type="file" accept="image/*"  class='file' id='uploadImg' value=''>      
<img src="" class='imgShow' />
 $('#uploadImg').on('change',function(event){
        if(!isCanvasSupported){  
                return;
         }else{  
            compress(event, function(base64Img){  
                $(".imgShow").attr("src",base64Img);  
                console.log(base64Img);  //压缩的base64的图片格式,通过ajax上传
                //点击图片放大
                    $('.imgShow').click(function(){
                        var width = $('.imgShow').width();    //通过判断元素的宽度
                        console.log(width)          
                        if(width == '200'){
                            $('.mengban').show();
                            $('.imgShow').addClass('changeImg')
                        }
                        $('.mengban').click(function(){
                            $('.imgShow').removeClass('changeImg')
                            $('.mengban').hide();
                        })
                    })
                     ajax('qnl_app/tes_ac_img',{'base64Img':base64Img},function(date){  
                        console.log(JSON.stringify(date)); 
                        $('.imgShow').attr("src",data); 
                     });  
                });  
             }  
      })
压缩图片用的js方法如下:
//判断是否存在画布  
function isCanvasSupported() {  
    var elem = document.createElement('canvas');  
    return !!(elem.getContext && elem.getContext('2d'));  
}  

//压缩方法  
function compress(event, callback) {  
    if ( typeof (FileReader) === 'undefined') {  
        console.log("当前浏览器内核不支持base64图标压缩");  
        //调用上传方式  不压缩  
    } else {  
        try {  
            var file = event.currentTarget.files[0];  
             if(!/image\/\w+/.test(file.type)){     
                    alert("请确保文件为图像类型");    
                    return false;    
             }   
            var reader = new FileReader();  
            reader.onload = function (e) {  
            var image = $('<img/>');  
            image.load(function () {  
            console.log("开始压缩");  
            var square = 700;  
            var canvas = document.createElement('canvas');  
            canvas.width = square;  
            canvas.height = square;  
            var context = canvas.getContext('2d');  
            context.clearRect(0, 0, square, square);  
            var imageWidth;  
            var imageHeight;  
            var offsetX = 0;  
            var offsetY = 0;  
            if (this.width > this.height) {  
              imageWidth = Math.round(square * this.width / this.height);  
              imageHeight = square;  
              offsetX = - Math.round((imageWidth - square) / 2);  
            } else {  
              imageHeight = Math.round(square * this.height / this.width);  
              imageWidth = square;  
              offsetY = - Math.round((imageHeight - square) / 2);  
            }  
            context.drawImage(this, offsetX, offsetY, imageWidth, imageHeight);  
            var data = canvas.toDataURL('image/jpeg');  
                //压缩完成执行回调  
               callback(data);  
            });  
            image.attr('src', e.target.result);  
            };  
            reader.readAsDataURL(file);  
        } catch(e) {  
            console.log("压缩失败!");  
            //调用上传方式  不压缩  
        }  
    }  
}  
<think>嗯,用户想了解iView Upload组件如何实现上传图片本地预览。首先,我需要回忆iView(现在叫View Design)的上传组件的基本用法。记得Upload组件支持文件上传,并且可以通过设置属性来实现预览。 接下来,本地预览的关键应该是在选择文件后,不等待服务器响应就能显示图片。通常这需要用到FileReader API,将文件读取为DataURL。iView的Upload组件是否有内置的预览功能呢?查看文档,发现before-upload钩子可以用来处理文件,在这里可以读取文件并生成预览。 然后,用户可能需要代码示例。需要确保他们使用的是正确的属性,比如设置list-type为picture,并且使用before-upload来生成预览URL。同时,要记得在data中定义previewImage和previewVisible等变量,用于控制预览模态框的显示。 还需要考虑手动触发预览,因为默认点击文件名可能不会显示图片。可能需要自定义on-preview事件,将预览图赋值给模态框,并显示出来。此外,样式和模态框的关闭事件也需要处理,比如设置on-visible-change来隐藏预览。 可能遇到的问题包括跨浏览器的兼容性,FileReader的使用是否正确,以及图片路径是否正确绑定到组件的file-list。要提醒用户确保每个文件的url属性正确,这样组件才能正确显示预览图。 最后,是否需要分步骤说明?用户可能需要从引入组件、配置属性、处理预览逻辑到显示模态框的完整流程。确保代码示例清晰,并解释关键部分的作用,比如before-upload的作用和FileReader的使用。</think>iView(现为 View Design)Upload 组件实现本地图片预览的步骤如下: ### 一、核心原理 通过 `before-upload` 钩子 + `FileReader` API 实现: 1. 选择文件时触发 `before-upload` 2. 用 `FileReader` 将图片转为 base64 格式 3. 手动更新 `file-list` 数据实现预览 ### 二、基础代码实现 ```vue <template> <Upload action="//jsonplaceholder.typicode.com/posts/" :before-upload="handlePreview" :file-list="fileList" list-type="picture" @on-remove="handleRemove"> <Button icon="ios-cloud-upload-outline">选择图片</Button> </Upload> </template> <script> export default { data() { return { fileList: [] } }, methods: { handlePreview(file) { return new Promise((resolve) => { const reader = new FileReader() reader.readAsDataURL(file) reader.onload = () => { this.fileList.push({ name: file.name, url: reader.result // 生成base64预览地址 }) resolve(false) // 阻止自动上传 } }) }, handleRemove(file) { const index = this.fileList.indexOf(file) this.fileList.splice(index, 1) } } } </script> ``` ### 三、关键配置说明 1. `list-type="picture"`:启用图片列表模式 2. `:file-list`:绑定响应式的文件列表数据 3. `before-upload`:上传前处理预览逻辑 4. `resolve(false)`:阻止自动提交到action地址 ### 四、扩展功能 - 大图预览 增加预览模态框: ```vue <template> <!-- 在Upload组件添加 --> @on-preview="handleImagePreview" <Modal v-model="previewVisible" title="预览" footer-hide> <img :src="previewImage" style="width: 100%"> </Modal> </template> <script> export default { data() { return { previewVisible: false, previewImage: '' } }, methods: { handleImagePreview(file) { this.previewImage = file.url this.previewVisible = true } } } </script> ``` ### 五、注意事项 1. 需要手动维护 `fileList` 的状态 2. 浏览器兼容性:IE10+ 支持 FileReader 3. 大文件建议做压缩处理(可配合 canvas) 4. 真实上传需在确认操作后手动调用上传接口 通过这种实现方式,可以在不依赖服务器响应的情况下,立即展示用户选择的本地图片预览效果。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值