H5下载图片,并保存到手机相册

最近写了一个移动端项目,h5内嵌套移动项目,在手机app中保存图片失败,原因是项目的保存图片是用的a标签下载,在手机上不起作用。所以使用H5的内置Api对图片进行保存。

官网地址:HTML5+ API Reference

代码实现:

export default {
  data() {
    return {};
  },
  methods: {
    // h5+ 保存图片到相册
    plusSaveImg(filename) {
      plus.gallery.save(
        filename,
        () => {
          this.$notify.success({
            title: "友情提示",
            message: "已保存到系统相册",
            position: "bottom-right",
          });
        },
        (e) => {
          console.log(e.message);
        }
      );
    },
    // 下载按钮和功能
    clickImage(imageUrl) {
      this.$nextTick(() => {
          try {
                const downloadTask = plus.downloader.createDownload(
                  imageUrl,
                  {
                    filename: "_downloads/" + "保存图片.png",
                  },
                  (download, status) => {
                    if (status === 200) {
                      let fileSaveUrl = plus.io.convertLocalFileSystemURL(
                        download.filename
                      );
                      this.plusSaveImg(fileSaveUrl);
                    } else {
                      console.log(`file download fail, status code: ${status}`);
                    }
                  }
                );
                downloadTask.start();
              } catch (error) {
                console.log(error);
              }         
      });
    }
  },
};

我这个是h5页面嵌套了移动端的项目,如果是浏览器中下载图片还是要走以前的a标签方式。

### 实现保存图片手机相册的方法 对于 Vue H5 应用来说,在尝试实现保存图片手机相册功能时会遇到权限问题以及跨平台兼容性挑战。由于浏览器沙盒机制的存在,H5 页面本身没有直接操作本地文件系统的权限[^1]。 #### 权限处理方案 针对 Android 平台,可以通过 JavaScript 调用原生接口来请求存储权限: ```javascript if (navigator.userAgent.indexOf('Android') !== -1) { window.AndroidFunction.requestStoragePermission(); } ``` 这段代码会在检测到设备为安卓系统时触发相应函数以申请必要的读写权限[^3]。 而对于 iOS 设备而言,则无需特别处理此权限因为 Safari 浏览器默认已经具备一定级别的访问控制。 #### 图片保存逻辑设计 为了使用户能够顺利地将网页上的图像保存下来,可以考虑如下两种方式之一: ##### 方案A:通过分享组件间接完成 利用微信内置浏览器或其他支持的应用程序提供的社交分享入口让用户自行选择是否要下载储存媒体资源。这种方式不需要额外编写复杂的脚本就能满足基本需求[^4]。 ##### 方案B:借助第三方库或插件增强能力 采用一些成熟的开源工具包如 `html-to-image` 或者特定于移动环境下的 SDK ,它们往往封装好了底层 API 的调用细节从而简化开发者的工作量。不过需要注意的是这类解决方案可能仍然受限于各操作系统版本差异所带来的不确定性因素影响其稳定性表现[^2]。 #### 示例代码片段展示 下面给出一段简单的 HTMLJS 组合用于演示如何监听长按事件进而发起保存动作(适用于部分场景下模拟类似效果),实际项目中还需结合具体情况调整优化: ```html <img src="{{imageUrl}}" @touchstart="handleTouchStart" /> <!-- 注意这里使用了 vue.js 的语法糖 --> ``` ```javascript methods: { handleTouchStart(event){ const touch = event.touches[0]; let longPressTimer; function onTouchMove(){ clearTimeout(longPressTimer); document.removeEventListener('touchmove',onTouchMove,false); document.removeEventListener('touchend',onTouchEnd,false); } function onTouchEnd(){ if(new Date().getTime() - startTime > 800){ // 自定义长时间阈值判断标准 saveImageToAlbum(this.src); // 假设存在这样一个异步方法负责最终执行保存流程 }else{ console.log("Short press"); } clearTimeout(longPressTimer); document.removeEventListener('touchmove',onTouchMove,false); document.removeEventListener('touchend',onTouchEnd,false); } var startTime=new Date().getTime(); longPressTimer=setTimeout(onTouchEnd,800); document.addEventListener('touchmove',onTouchMove,{passive:false}); document.addEventListener('touchend',onTouchEnd); }, async saveImageToAlbum(url){ try{ await navigator.clipboard.writeText(url); // 这里仅作为示意,真实环境中应替换为此处提到过的更合适的技术手段 alert("已复制链接,请前往图库粘贴查看!"); }catch(err){ console.error("Failed to copy image URL",err); } } } ```
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

茶杯茶凉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值