• vue-cropper在ie11下选择本地图片后,无显示、拒绝访问的问题


    问题:vue-cropper在ie11下选择本地图片后,网页上并未显示出图片,打开F12有报错:拒绝访问blabla的。但是在chrome下一切正常。

    开发环境:node14.17.5 , vue2 , vue-cropper0.6.2 , macOS big sur 11.4(M1).

    解决办法:

    将vue-cropper的img的值设置为blob url即可解决。

    代码:

    vue部分

    1. <el-row>
    2. <el-col :xs="24" :md="12" :style="{height: '350px'}">
    3. <vue-cropper
    4. ref="cropper"
    5. :img="options.imgUrl"
    6. :info="true"
    7. :autoCrop="options.autoCrop"
    8. :autoCropWidth="options.autoCropWidth"
    9. :autoCropHeight="options.autoCropHeight"
    10. :fixedBox="options.fixedBox"
    11. @realTime="realTime"
    12. @imgLoad="imgLoad"
    13. v-if="visible"
    14. />
    15. el-col>
    16. <el-col :xs="24" :md="12" :style="{height: '350px'}">
    17. <div class="avatar-upload-preview">
    18. <img :src="previews.url" :style="previews.img" />
    19. div>
    20. el-col>
    21. el-row>
    22. <br>
    23. <el-row>
    24. <el-col :lg="2" :md="2">
    25. <el-upload action="#" :http-request="requestUpload" :show-file-list="false" :before-upload="beforeUpload">
    26. <el-button size="small">
    27. 选择
    28. <i class="el-icon-upload el-icon--right">i>
    29. el-button>
    30. el-upload>
    31. el-col>
    32. el-row>

    js部分:

    1. export default {
    2. data(){
    3. return {
    4. visible:false,
    5. options: {
    6. imgUrl: '', //裁剪图片的地址
    7. autoCrop: true, // 是否默认生成截图框
    8. autoCropWidth: 200, // 默认生成截图框宽度
    9. autoCropHeight: 200, // 默认生成截图框高度
    10. fixedBox: true // 固定截图框大小 不允许改变
    11. },
    12. }
    13. },
    14. mounted(){
    15. this.visible = true
    16. },
    17. methods: {
    18. // 上传预处理
    19. beforeUpload(file) {
    20. if (file.type.indexOf("image/") == -1) {
    21. alert("文件格式错误,请上传图片类型,如:JPG,PNG后缀的文件。");
    22. } else {
    23. // 创建一个 URL 对象
    24. const blobUrl = URL.createObjectURL(file);
    25. this.options.imgUrl = blobUrl;
    26. }
    27. },
    28. }
    29. }

    关键的解决问题的代码就是beforeUpload这个方法,使用URL.createObjectURL将你选择的本地图片文件转为一个blob url,即可保证ie11和chrome下都可以正常选择本地图片并且进行后续操作。

    但如果你不需要考虑ie11,只用chrome的话,那这里用new FileReader().readAsDataURL()把图片文件转为base64格式的数据也可以用。具体写法:

    1. // 上传预处理
    2. beforeUpload(file) {
    3. if (file.type.indexOf("image/") == -1) {
    4. alert("文件格式错误,请上传图片类型,如:JPG,PNG后缀的文件。");
    5. } else {
    6. const reader = new FileReader();
    7. reader.readAsDataURL(file);
    8. reader.onload = () => {
    9. this.options.imgUrl = reader.result;
    10. };
    11. }
    12. },

    原因:

    这个其实是vue-cropper0.6.2这个版本自己的问题。它在处理图片时,加了这么一段:

    1. if (this.isIE) {
    2. var xhr = new XMLHttpRequest();
    3. xhr.onload = function() {
    4. var url = URL.createObjectURL(this.response);
    5. img.src = url;
    6. };
    7. xhr.open("GET", this.img, true);
    8. xhr.responseType = "blob";
    9. xhr.send();
    10. } else {
    11. img.src = this.img;
    12. }

    这就导致在ie11的环境下,图片只能传入blob url的格式,传入其他的格式比如base64的就处理不了。

  • 相关阅读:
    药品大数据公司都有哪些?
    Win11应用商店无法加载页面怎么办?Win11商店无法加载页面
    CAP 6.1 版本发布通告
    深入理解Spring Boot Starter:概念、特点、场景、原理及自定义starter
    用纯css实现一个图片拼接九宫格
    基于Spring Boot的仿豆瓣平台
    会议OA(会议排座&送审)
    国内外都可以使用的【免费AI工具】,实用性满满
    python实现五子棋游戏(pygame版)(附零基础学习资料)
    ZYNQ自带I2S_IP核分析
  • 原文地址:https://blog.csdn.net/hamupp/article/details/132664147