原生js实现图片上传功能

在项目中用到了原生的上传功能,html5代码如下

        <div class="uploadimg">
          <div  v-for="(item, index) in checkList" :key="index" >
              <image
                class="mask"
                :src="checkList[index]"
                place-holder="imageLoad('person-center-doctor-default.png')"
                @click="picClick(item)"
              ></image>
              <image class="img-cancel" v-if="item" :src="imageLoad('erase',true)" @click="imgCancel(index,'check')"></image>
          </div>
          <image
            class="mask"
            @click="addClick('check')"
            :src="imageLoad('add', true)"
          ></image>
        </div>

列表循环显示的是已经上传的图片,点击功能为添加的预览功能,下面的image标签为相对定位的删除图标,点击可删除对应图片,最下面的image是点击上传图标,点击图标可上传对应图片。
再来看下js代码

    imgCancel(index,type){
         this.checkList.splice(index,1)
    },
     addClick(type) {
      if(type=='check'&&this.checkList.length>8){
        normal.toast("最多上传9张图片");
        return
      }
      if(type=='desc'&&this.miaoShuList.length>8){
        normal.toast("最多上传9张图片");
        return
      }
      this.chooseFile().then((res) => {
        let file = res;
        console.log(res);
        let fileUrl = URL.createObjectURL(file[0]); // 获取文件url
        console.log("输出选择的图片的路径 :", fileUrl, file, this.idCardUrl);
        if (fileUrl.length == 0) {
          return;
        }

        // let imgList = [];
        // imgList.push({
        //   src: file[0].name,
        // });

        let param = new FormData(); // 创建form对象
        param.append("file", file[0], file[0].name); // 通过append向form对象添加数据
        // alertUtil.loading(true, "正在上传中...");
        var cacheUrl = api.UPLOAD_PATIENT_IMAGE + "?token=" + userInfoCache.getUserToken();
        business.req(
          "post",
          cacheUrl,
          param,
          function (resp) {
            // this.portrait = resp.extra;
            if(type=='desc'){
                this.miaoShuList.push(resp.extra);
            }else if(type=='check'){
                this.checkList.push(resp.extra)
            }
            // normal.saveStorage(
            //   cacheKeys.PhotoImageUrl,
            //   this.portrait,
            //   function () {}
            // );
            normal.toast("图片上传成功");
            console.log("this.portrait========", resp.extra);
          }.bind(this),
          function(err){
            console.log(err);
            normal.toast("超时");
          }.bind(this)
        );
      });
    },
    //唤起上传文件
        chooseFile() {
      return new Promise((resolve, reject) => {
        let fileinput = document.createElement("input");
        fileinput.type = "file";
        // fileinput.multiple = true
        fileinput.accept = "image/*";
        fileinput.setAttribute(
          "style",
          "position:fixed;left:-500px;top:-500px;"
        );
        fileinput.addEventListener("change", () => {
          resolve(fileinput.files);
          document.body.removeChild(fileinput);
          if (!fileinput.files || fileinput.files.length === 0)
            reject(new Error("文件选择出错"));
        });
        document.body.appendChild(fileinput);
        fileinput.click();
      });
    },
    //点击进行图片预览
        picClick(item){
            console.log(item);
            let pswpElement = document.querySelectorAll('.pswp')[0];
            let items=[{
                src:item,
                w:200,
                h:200
            }]
                let options = {
                    pinchToClose:true,
                    shareEl:false,
                    tapToToggleControls:false,
                    tapToClose:true,
                    index:0 
                };
                let gallery = new PhotoSwipe( pswpElement, PhotoSwipeUI_Default, items, options);
                gallery.init();
    },

预览功能用的photoswipe插件,采用的cdn引入的方式,在index.html中引入地址如下

    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/photoswipe/4.1.1/photoswipe.min.css">
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/photoswipe/4.1.1/default-skin/default-skin.min.css">
    <script src="https://cdnjs.cloudflare.com/ajax/libs/photoswipe/4.1.1/photoswipe.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/photoswipe/4.1.1/photoswipe-ui-default.min.js"></script>

然后在app.vue页面还要加上如下代码

    <div class="pswp" tabindex="-1" role="dialog" aria-hidden="true">
      <!-- Background of PhotoSwipe. 
         It's a separate element as animating opacity is faster than rgba(). -->
      <div class="pswp__bg"></div>

      <!-- Slides wrapper with overflow:hidden. -->
      <div class="pswp__scroll-wrap">
        <!-- Container that holds slides. 
            PhotoSwipe keeps only 3 of them in the DOM to save memory.
            Don't modify these 3 pswp__item elements, data is added later on. -->
        <div class="pswp__container">
          <div class="pswp__item"></div>
          <div class="pswp__item"></div>
          <div class="pswp__item"></div>
        </div>

        <!-- Default (PhotoSwipeUI_Default) interface on top of sliding area. Can be changed. -->
        <div class="pswp__ui pswp__ui--hidden">
          <div class="pswp__top-bar">
            <!--  Controls are self-explanatory. Order can be changed. -->

            <div class="pswp__counter"></div>

            <button
              class="pswp__button pswp__button--close"
              title="Close (Esc)"
            ></button>

            <button
              class="pswp__button pswp__button--share"
              title="Share"
            ></button>

            <button
              class="pswp__button pswp__button--fs"
              title="Toggle fullscreen"
            ></button>

            <button
              class="pswp__button pswp__button--zoom"
              title="Zoom in/out"
            ></button>

            <!-- Preloader demo https://codepen.io/dimsemenov/pen/yyBWoR -->
            <!-- element will get class pswp__preloader--active when preloader is running -->
            <div class="pswp__preloader">
              <div class="pswp__preloader__icn">
                <div class="pswp__preloader__cut">
                  <div class="pswp__preloader__donut"></div>
                </div>
              </div>
            </div>
          </div>

          <div
            class="pswp__share-modal pswp__share-modal--hidden pswp__single-tap"
          >
            <div class="pswp__share-tooltip"></div>
          </div>

          <!-- <button class="pswp__button pswp__button--arrow--left" title="Previous (arrow left)">
            </button>

            <button class="pswp__button pswp__button--arrow--right" title="Next (arrow right)">
            </button> -->

          <div class="pswp__caption">
            <div class="pswp__caption__center"></div>
          </div>
        </div>
      </div>
    </div>

样式如下

.pswp__top-bar {
  display: inline !important;
}

完成上述代码后,预览图片时直接调用预览方法即可不需要额外引入

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
实现在手机端上传身份证并提交表单的功能,可以使用原生 JavaScript编写以下代码: HTML部分: ``` <form id="myForm" enctype="multipart/form-data"> <input type="file" accept="image/*" capture="camera" id="idcard" name="idcard" /> <button type="button" onclick="submitForm()">提交</button> </form> ``` JavaScript部分: ```javascript function submitForm() { let formData = new FormData(); // 创建FormData对象 let fileInput = document.getElementById("idcard"); if (fileInput.files.length > 0) { let file = fileInput.files[0]; formData.append("idcard", file); // 将文件添加到FormData对象中 } // 发送表单数据 let xhr = new XMLHttpRequest(); xhr.open("POST", "submit_url", true); xhr.onreadystatechange = function() { if (xhr.readyState === XMLHttpRequest.DONE && xhr.status === 200) { // 请求成功的处理代码 console.log(xhr.responseText); } }; xhr.send(formData); // 发送FormData对象 } ``` 以上代码中,表单中的文件输入框为`<input type="file">`,通过`capture="camera"`属性可以直接调用手机相机进行拍照或选择相册中的图片。使用`accept="image/*"`限制只能选择图片文件。点击提交按钮时,会调用`submitForm`函数。 函数内部,首先创建一个`FormData`对象用于存储表单数据。然后,从文件输入框中获取选中的文件对象,并将其添加到`FormData`对象中,使用`append`方法。在`xhr`对象上调用`open`方法打开一个POST请求,并设置请求地址。然后,通过`onreadystatechange`函数监听请求状态和响应。最后,使用`send`方法发送`FormData`对象。 你需要将"submit_url"替换为实际的提交地址。在请求成功时,可以根据需要处理响应数据。通过控制台打印`xhr.responseText`,你可以查看服务器返回的内容。 请注意,上传文件可能需要服务器端的相应配置。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值