【问题标题】:How to display mysql blob image in html using Vuejs?如何使用 Vuejs 在 html 中显示 mysql blob 图像?
【发布时间】:2017-11-24 07:51:57
【问题描述】:

我有一个这样的vue文件,

export default {
	data(){
		return{
            info: {
                name: '',
                image: '',
              
            },
            errors: []
		}
	},
  
  created: function(){
        this.getInfo();
  },
  
  methods: {
        getInfo: function(){
              this.info.name = response.data.results[0].name;
              this.info.image = response.data.results[0].image;
        }
  }
}

我正在将此文件中的数据传递到子 Vue 组件中。子组件如下,

<template>
    <div class="ui items">
        <div class="item">
            <div class="ui small image">
                {{info.image}}
            </div>
        </div>
    </div>
  
</template>

<script>
export default{

    props:['info']

}
</script>

我的图像以 blob 形式存储在 MySQL 数据库中。当我运行我的应用程序时,图像在 UI 上显示为二进制数据。对象是这样的,

这里有人可以帮我显示图片吗?非常感谢你!

【问题讨论】:

    标签: javascript html mysql vue.js blob


    【解决方案1】:

    你想要的是data url。您需要将字节数组转换为 base64。无法使用原始字节。也许在计算属性中使用one of the byte array to base64 functions

    标记

    <img :src="dataUrl">
    

    行为(未经测试!)

    computed : {
        dataUrl(){
            return 'data:image/jpeg;base64,' + btoa(
                new Uint8Array(this.info.image)
                .reduce((data, byte) => data + String.fromCharCode(byte), '')
            );
        }
    }
    

    搜索你的良心。这真的不是一个好主意 :-) 将图像作为 JSON 编码的字节数组发送是 我从未见过的,并且猜测,它在网络上的大小大约是 10 倍二值图像。 Images in the DB are an antipattern。 JSON 中的图像可以工作,但它们应该在 JSON 中编码为 base64 字符串。即便如此,它们也会降低 JSON 的可读性,并且会掩埋 Postman 之类的工具。数据 url 是 much slower 比常规 url 加载。即使在数据库中使用图像,如果您控制您的 api,您可以通过使用 application/jpeg mime 类型制作仅返回字节数组的图像 api 获得很多收益。

    【讨论】:

    • 请查看我的帖子。它已被更新。我已经分享了图像的 JSON 响应是什么样的
    【解决方案2】:

    可以使用Base64格式加载图片数据,像这样,

    <img src="data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAZCAYAAADE6YVjAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MEVBMTczNDg3QzA5MTFFNjk3ODM5NjQyRjE2RjA3QTkiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MEVBMTczNDk3QzA5MTFFNjk3ODM5NjQyRjE2RjA3QTkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDowRUExNzM0NjdDMDkxMUU2OTc4Mzk2NDJGMTZGMDdBOSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDowRUExNzM0NzdDMDkxMUU2OTc4Mzk2NDJGMTZGMDdBOSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PjjUmssAAAGASURBVHjatJaxTsMwEIbpIzDA6FaMMPYJkDKzVYU+QFeEGPIKfYU8AETkCYI6wANkZQwIKRNDB1hA0Jrf0rk6WXZ8BvWkb4kv99vn89kDrfVexBSYgVNwDA7AN+jAK3gEd+AlGMGIBFDgFvzouK3JV/lihQTOwLtOtw9wIRG5pJn91Tbgqk9kSk7GViADrTD4HCyZ0NQnomi51sb0fUyCMQEbp2WpU67IjfNjwcYyoUDhjJVcZBjYBy40j4wXgaobWoe8Z6Y80CJBwFpunepIzt2AUgFjtXXshNXjVmMh+K+zzp/CMs0CqeuzrxSRpbOKfdCkiMTS1VBQ41uxMyQR2qbrXiiwYN3ACh1FDmsdK2Eu4J6Tlo31dYVtCY88h5ELZIJJ+IRMzBHfyJINrigNkt5VsRiub9nXICdsYyVd2NcVvA3ScE5t2rb5JuEeyZnAhmLt9NK63vX1O5Pe8XaPSuGq1uTrfUgMEp9EJ+CQvr+BJ/AAKvAcCiAR+bf9CjAAluzmdX4AEIIAAAAASUVORK5CYII=">
    

    对于你的问题,

    export default {
        data(){
            return{
                info: {
                    name: '',
                    image: '',
    
                },
                errors: []
            }
        },
    
      created: function(){
            this.getInfo();
      },
    
      methods: {
            getInfo: function(){
                  this.info.name = response.data.results[0].name;
                  this.info.image = 'data:image/jpeg;base64,' + btoa(response.data.results[0].image.data);
            }
      }
    }
    

    在模板中,

    <template>
        <div class="ui items">
            <div class="item">
                <div class="ui small image">
                    <img :src="info.image">
                </div>
            </div>
        </div>
    </template>
    

    【讨论】:

    • 这当然是一个解决方案,但不是很有效。这是一项乏味的任务。将来有多个图像需要从数据库中加载。我可以使用任何内置功能吗?谢谢!
    • 不确定有没有更好的方法。但为了更清楚,看看here
    • 不确定更好的方法,但您也可以查看这个stackoverflow.com/questions/41859827/binding-img-src
    • @Anwarus 谢谢。请检查我的帖子。它已被更新。我已经分享了图像的 JSON 响应是什么样的。
    • @CasperSL 请查看我的帖子。它已被更新。我已经分享了图像的 JSON 响应是什么样的
    【解决方案3】:
    <img :src="require(`../../assets/images/products/${product.img}`)" />
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-11-09
      • 2012-09-25
      • 2011-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-26
      相关资源
      最近更新 更多