Vue实现读取本地图片的示例代码

 更新时间:2023年07月16日 15:52:28   作者:小和尚敲木头  
这篇文章主要为大家详细介绍了如何利用Vue实现读取本地图片的功能,文中的示例代码讲解详细,具有一定的参考价值,需要的小伙伴可以学习一下

制作一个简单的展示页面

需要读取本地静态文件获取文字信息 和确定图片路劲

刚开始都是使用new XMLHttpRequest()。本地测试都没有问题。但是部署到云服务器时 对图片的判断就失效了 无论请求地址多少 返回响应码都是200.(没有找到原因)。 所以更换了方式 使用img的加载失败回调方法。

url中文编码问题(也是本地测试没问题,线上就必须转码了)decodeURI()

官方文档

// app.vue
<template>
  <div id="app">
    <div class="header">
      <div class="main">
        <div class="drug-name">
          <span>{{drugName}}</span>
        </div>
        <div class="drug-img">
          <img :src="drugImg" :alt="drugName" @error="imageLoadError">
        </div>
        <div class="drug-info" v-html="drugInfo"></div>
      </div>
    </div>
  </div>
</template>
<script >
export default {
  components: {
  },
  created() {
    this.init()
    this.OpenPup();
    // this.imgChange();
    console.log(this.$route.query)
  },
  data(){
    return {
      drugName: '',
      drugInfo: '',
      drugImg: '',
      imgCheckCount: 0
    }
  },
  methods:{
    init(){
      this.drugName=decodeURI(this.$route.query.drugName)
      // this.drugName=decodeURI(this.$route.query.drugName)
      console.log(this.$route.query.drugName)
      // var destr = UrlDecode(str);
      // this.imgChange()
      this.drugImg = 'image/'+this.drugName+'.jpg'
    },
    imageLoadError(e){
      console.log("onerror")
      // this.drugImg = 'image/'+this.drugName+'.JPG'
      // this.loadingOnOff = true
      this.imgCheckCount += 1
      this.imgCheks()
      e.target.onerror = null
    },
    imgCheks(){
      if(this.imgCheckCount === 1){
        this.drugImg = 'image/'+this.drugName+'.JPG'
      }else if(this.imgCheckCount === 2){
        this.drugImg = 'image/'+this.drugName+'1.jpg'
      }else if(this.imgCheckCount === 3){
        this.drugImg = 'image/'+this.drugName+'1.JPG'
      }
    },
    imgChange(){
      // console.log("ceshi"+this.drugName)
      // console.log("ceshi"+this.isFileExist('image/'+this.drugName+'.jpg'))
      // console.log("ceshi"+this.isFileExist('image/'+this.drugName+'1.jpg'))
      if(this.checkImg('image/'+this.drugName+'.jpg')){
        this.drugImg = 'image/'+this.drugName+'.jpg'
      }else if(this.checkImg('image/'+this.drugName+'.JPG')){
        this.drugImg = 'image/'+this.drugName+'.JPG'
      }else if(this.checkImg('image/'+this.drugName+'1.jpg')){
        this.drugImg = 'image/'+this.drugName+'1.jpg'
      }else if(this.checkImg('image/'+this.drugName+'1.JPG')){
        this.drugImg = 'image/'+this.drugName+'1.JPG'
      }
      // console.log(this.drugImg)
      // console.log(this.isFileExist('image/'+this.drugName+'.jpg'))
    },
    OpenPup(){
      let xhr = new XMLHttpRequest()
      //  let okStatus = document.location.protocol === "file:" ? 0 : 200;
      // xhr.open("GET", val.url, false); // 线上链接地址
      // let drugUrl = this.drugName+".text"
      let drugUrl = 'drug/'+this.drugName+".txt"
      xhr.open("GET", drugUrl, false); // public文件夹下的绝对路径
      xhr.overrideMimeType("txt/html;charset=utf-8")
      xhr.send(null)
      // console.log(xhr.responseText)  // xhr.responseText为文本中的内容
      this.drugInfo = xhr.responseText
      // console.log(this.drugInfo)
    },
    // // 判断本地是否有该文件
    // showimg (url) {
    //   // 判断结果
    //   let result = false
    //   url = './' + url
    //   // 获取该目录下所有文件名
    //   const files = require.context('public/image/', false, /\.jpg$/)
    //   console.log(files.keys())
    //   const filedata = files.keys()
    //   // 判断是否有该文件
    //   filedata.forEach((item) => {
    //     if (item === url) {
    //       result = true
    //     }
    //   })
    //   // 返回结果
    //   return result
    // },
    isFileExist(filePath) {
      let xhr = new XMLHttpRequest();
      xhr.open('GET', filePath, false);
      xhr.send();
      console.log(xhr)
      return xhr.status === 200;
    },
    checkImg(imgurl) {
      var imgObj = new Image();
      imgObj.src = imgurl;
      imgObj.onload = function (res) {
        return true;
        console.log('有效链接')
      }
      imgObj.onerror = function (err) {
        return false;
        console.log('无效链接')
      }
    }
  }
};
</script>
<style lang="less">
//#app {
//  font-family: Avenir, Helvetica, Arial, sans-serif;
//  -webkit-font-smoothing: antialiased;
//  -moz-osx-font-smoothing: grayscale;
//  text-align: center;
//  color: #2c3e50;
//}
html,body{ width: 100%; height: 100%; overflow: scroll;}
html::-webkit-scrollbar, body::-webkit-scrollbar{width:0px;height:0px;}
body{
  margin: 0;
  padding: 0;
}
#app{
  width: 100vw;
  margin: 0;
  padding: 0;
}
.header {
  /*line-height: 1.5;*/
  /*max-height: 100vh;*/
  margin: 0;
  padding: 0;
  width: 100vw;
  background-color: blanchedalmond;
}
.main{
  margin: 0 5vw;
  width: 90vw;
  min-height: 100vh;
  background-color: white;
}
.drug-name{
  margin-bottom: 10vw;
  padding-top: 10vw;
  text-align:center
}
.drug-name span{
  /*margin: auto;*/
  /*margin-left: 50px;*/
  color: #181818;
  font-size: 32px;
  font-weight: bold;
  display: inline-block;
  margin: 0 auto;
  text-align: center;
}
.drug-img {
  text-align:center
}
.drug-img img{
  max-width: 80vw;
  height: auto;
  width: auto;
  margin: auto;
  text-align:center
}
.drug-info {
  margin: 5vw 5vw 0;
  padding-bottom: 5vw;
  font-size: 16px;
  color: #181818;
  line-height: 30px;
  overflow: auto;
}
.drug-info span{
  font-size: 16px;
  color: #181818;
}
h1 {
  font-size: 20px;
  text-align: left;
  margin-bottom: 10px;
}
::v-deep p{
  margin-bottom: 15px;
}
::v-deep b {
  font-size: 19px;
  font-weight: bold;
  /*margin-bottom: 15px;*/
  /*padding-bottom: 15px;*/
  text-indent:2em;
}
</style>

以上就是Vue实现读取本地图片的示例代码的详细内容,更多关于Vue读取本地图片的资料请关注脚本之家其它相关文章!

相关文章

  • 基于Vue3+ts封装一个简单版的Message组件

    基于Vue3+ts封装一个简单版的Message组件

    近日项目中需要使用信息提示框的功能,ui组件库使用的是字节的arco-design-vue,看了一下,现有的Message不满足要是需求,直接使用message组件的话,改样式太麻烦,所以本文就本就介绍了基于Vue3+ts封装一个简单版的Message组件,需要的朋友可以参考下
    2023-09-09
  • vue-cli3启动服务如何自动打开浏览器配置

    vue-cli3启动服务如何自动打开浏览器配置

    这篇文章主要介绍了vue-cli3启动服务如何自动打开浏览器配置,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-09-09
  • vue3动态加载组件以及动态引入组件详解

    vue3动态加载组件以及动态引入组件详解

    ​平常的vue项目开发,已经很难遇见一千行,甚至几千行代码的页面了,毕竟大家都会去拆分组件,下面这篇文章主要给大家介绍了关于vue3动态加载组件以及动态引入组件的相关资料,需要的朋友可以参考下
    2023-03-03
  • Vue.js实现微信过渡动画左右切换效果

    Vue.js实现微信过渡动画左右切换效果

    这篇文章主要给大家介绍了利用Vue.js仿微信过渡动画左右切换效果的相关资料,需要用到的技术栈是Vue+Vuex。文中通过示例代码介绍的非常详细,对大家具一定的参考学习价值,需要的朋友们下面来一起看看吧。
    2017-06-06
  • Element中Slider滑块的具体使用

    Element中Slider滑块的具体使用

    这篇文章主要介绍了Element中Slider滑块的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • 在VUE3中禁止网页返回到上一页的方法

    在VUE3中禁止网页返回到上一页的方法

    这篇文章主要介绍了在VUE3中如何禁止网页返回到上一页,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-09-09
  • 利用webstrom调试Vue.js单页面程序的方法教程

    利用webstrom调试Vue.js单页面程序的方法教程

    这篇文章主要给大家介绍了利用webstrom调试Vue.js单页面程序的方法教程,文中介绍的非常详细,对大家具有一定的参考学习价值,需要的朋友们下面跟着小编一起来学习学习吧。
    2017-06-06
  • Vue默认插槽,具名插槽,作用域插槽定义及使用方法

    Vue默认插槽,具名插槽,作用域插槽定义及使用方法

    这篇文章主要介绍了Vue默认插槽,具名插槽,作用域插槽定义及使用方法,插槽的作用是在子组件中某个位置插入父组件的自定义html结构和data数据,下面详细内容需要的小伙伴可以参考一下
    2022-03-03
  • 如何修改ant design组件自带样式

    如何修改ant design组件自带样式

    这篇文章主要介绍了如何修改ant design组件自带样式问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12
  • 在vue中封装的弹窗组件使用队列模式实现方法

    在vue中封装的弹窗组件使用队列模式实现方法

    这篇文章主要介绍了在vue中封装的弹窗组件使用队列模式实现方法,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-07-07

最新评论