• 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的就处理不了。

  • 相关阅读:
    详解 TCP 原理
    SpringBoot保姆级教程(六)SpringBoot访问静态资源 & 整合JSP
    tomcat启动后,执行一个方法作为监听
    python新知识之------------------海象表达式
    【MySQL】数据库操作指南:数据类型篇
    【无标题】【3D建模制作技巧分享】zbrush中如何卡硬边?
    Vue开发时Vscode建议安装的常用插件
    ES6 set 数据结构及拓展运算符及map集合
    仪表盘样式百分比显示准确率等信息,通过旋转实现
    搭建部署属于自己的基于gpt3.5的大语言模型(基于flask+html+css+js+mysql实现)
  • 原文地址:https://blog.csdn.net/hamupp/article/details/132664147