美文网首页
H5上传图片

H5上传图片

作者: 金小可 | 来源:发表于2017-03-29 22:18 被阅读2463次

一、HTML

<input type="file" id="img-file"  capture="camera" multiple accept="image/*" onchange="handleFiles(this)"/>
备注:默认的样式看起来很糟糕,设置opacity=0,然后再加上设计样式;(具体可参考百度图片搜索)

1、input使用type=file进行文件选择;
2、capture="camera"表示可以捕获到系统默认的照相机;
3、multiple表示可以进行多选;
4、accept="image/*"表示匹配的文件类型;accept="image/gif,image/jpeg,image/jpg,image/png,image/svg"可以看得更清晰;

二、文件信息

window.handleFiles = function (element) {
    if (!element.files[0]) {
        return;
    }
    for (var prop in element.files[0]) {
            console.log('file info '+prop+':'+element.files[0][prop]);
    }
};

直接从File对象可以获取名称、修改时间、类型、大小等信息。

三、图片内容

1、FileReader.readAsDataURL
读取图片内容可以使用FileReader的readAsDataURL接口

var reader = new FileReader();
reader.onload = function (theFile) {
    document.getElementById('img-display').setAttribute('src', theFile.target.result);
// 读取到的theFile.target.result是base64数据
};
reader.readAsDataURL(element.files[0]);

FileReader的接口参数为File对象或Blob对象,用于读取文件内容。
主要的接口:
readAsBinaryString(Blob|File) :读取结果为二进制字符串,每个字节包含一个0到255之间的整数。
readAsText(Blob|File, opt_encoding) :读取结果是一个文本字符串。
readAsDataURL(Blob|File) : 读取结果是一个基于Base64编码的 data-uri 对象。
readAsArrayBuffer(Blob|File) :读取结果是一个 ArrayBuffer 对象。
主要的回调函数:
onabort:读取中断时触发。
onerror:读取出错时触发。
onload:读取成功后触发。
2、上传文件
一般情况下有两种方式上传文件:
2.1、通过File对象上传图片的二进制信息;
2.2、通过FileReader. readAsDataURL上传Base64编码对象;

四、入坑

1、accept="image/*"与accept="image/gif,image/jpeg,image/jpg,image/png,image/svg"
问题:使用前者在webkit内核浏览器可能导致选择文件延迟;而使用后者则很容易漏掉一些图片(尤其是一些奇葩的Android机型)
解决:没有好的解决方法,只能根据应用场景进行取舍。

2、capture="camera"不可用
问题:在一款华为的机器上加上capture="camera"后,不弹出文件选择框;
解决:去掉capture="camera";(好尴尬,真心不知道怎么办)

3、input file无法重复选择一个文件
问题:在监听input的onchange时,如果第二次选择的与第一次选择的文件相同,则不会回调onchange。
解决:如果确实需要回调,可以克隆一个同样的input

inputElement.after(newSomeQa.clone().val(""));
inputElement.remove();

4、iPhone的照片被90°旋转
问题:iPhone中保存的照片采用background-img的方式显示时会被90°旋转
解决:
4.1 采用img标签显示
4.2 读取照片的EXIF信息在显示做相应的旋转处理(才用background-img显示图片在处理缩放截取时比较方便)

EXIF.getData(element.files[0], function () {
    var orientationPhoto = EXIF.getTag(this, 'Orientation');
    var lastDeg;
    if (orientationPhoto == 6) {
       lastDeg = 90;
    } else if (orientationPhoto == 8) {
       lastDeg = 270;
    } else if (orientationPhoto == 3) {
       lastDeg = 180;
    }
    document.getElementById('img-display').style.transform = 'rotate(' + lastDeg + 'deg)';
});

五、附录——EXIF
Exif是一种图像文件格式,在JPEG格式头部插入了数码照片的一些拍摄信息。
EXIF.js——https://github.com/exif-js/exif-js

相关文章

  • Webview图片上传方法

    H5交互-图片上传 图片上传 H5使用file标签进行文件上传,我们可以重写webview的webchromeCl...

  • 解决小程序webview中无法上传图片问题

    最近被支付宝小程序内嵌H5无法上传图片折磨到没脾气,H5本身上传图片没问题,但是嵌套在小程序中就无法上传。 在调试...

  • APP的H5页面实现图片预览及压缩上传

    导语 本篇文章使用H5实现图片预览,压缩上传的功能,主要用到了以下知识点。 使用 获取上传的图片文件 使用H5 F...

  • 图片压缩上传

    参考1-HTML5实现图片压缩上传功能参考2-移动前端—图片压缩上传实践参考3-移动端H5图片压缩上传 大体步骤 ...

  • 图片压缩上传

    关键词:h5 FileReader、canvas压缩、多图片上传 一、前言 做过前端的同学都知道,图片上传是我们遇...

  • h5上传图片压缩包服务端解压并上传图片

    CMS后台有上传多个图片的需求,多个图片上传也一样麻烦。就想做个上传压缩包服务端解压上传的东西。 页面 使用h5的...

  • 图片中间部分显示

    手机H5仿微信多图上传中已经完成了图片上传的那部分,这篇文章主要讲的是图片展示的部分,效果图如下: 因为上传的图片...

  • vue 利用H5formData方式上传图片,解决IOS拍照旋转

    解决OIS 拍照旋转等问题,结合H5 formData的方式上传图片...

  • H5图片上传

    上传时,确保ios和安卓手机都能出现相册和拍照 把input自带的界面去除,用透明度:opacity:0。外框设置...

  • H5上传图片

    一、HTML 1、input使用type=file进行文件选择;2、capture="camera"表示可以捕获到...

网友评论

      本文标题:H5上传图片

      本文链接:https://www.haomeiwen.com/subject/qxrrottx.html