转自【B5教程网】:http://www.bcty365.com/content-142-5244-1.html

这次分享一个简易的上传头像示例,其大致流程为:

一、将选择的图片转为base64字符串

function preview(file) {//预览图片得到图片base64 
        var prevDiv = document.getElementById('preview'); 
        if (file.files && file.files[0]) { 
            var reader = new FileReader(); 
            reader.onload = function(evt){ 
                prevDiv.innerHTML = ''; 
            } 
            reader.readAsDataURL(file.files[0]); 
        } else { 
            prevDiv.innerHTML = '

'; 
        } 
    } 
上面的方法可将选择的图片转为base64预览,此时可以打桩看看base64到底是什么东东。

二、根据(阿里云)上传要求,对该图像base64去头等处理

var binaryblob = function (s, type) {//blob对象 
                    var byteString = atob(s); 
                    var array = []; 
                    for (var i = 0; i < byteString.length; i++) { 
                        array.push(byteString.charCodeAt(i)); 
                    } 
                    return  new Blob([new Int8Array(array)], {type: type}); 
                }; 
var binaryPictureBlob = function (dataUrl, filterHead) {//上传base64去头 
                    var s = filterHead ? dataUrl.replace(/^data:image\/(png|jpeg|pjpeg|bmp|gif|x-png);base64,/, "") : dataUrl; 
                    return binaryblob(s, "image/jpeg"); 
                }; 
此时将base64去头等处理后返回一个blob对象用于上传阿里云。以上方法最好写在service、factory里,以后有图像上传需求时方便直接调用,尽量不要写在controller内。

三、第一次请求
 
$scope.save=function(){//保存 
    var pic=binaryPictureBlob($('#preview img').attr('src'),true);//调用该方法得到上传数据 
    console.log(pic); 
    $http({//接口参数 
        url:'', 
        method:'', 
        headers:{}, 
        data:{} 
    }).success(function(data){ 
        console.log(data); 
      //这里讲进行第二次请求 
    }).error(function(err1,header1,config1,status1){//处理响应失败 
        console.log(err1,header1,config1,status1); 
    }) 

点击保存按钮后第一次请求是上传到本地服务器,实际是上传一些该图像的标记等信息。上传成功后会返回一个该图像对应的阿里云地址和一个阿里云上传图像的地址,此时该图像地址暂不可用。

四、第二次请求
 
$http({ 
    method:'PUT', 
    url:data.UrlForPut, 
    headers: { 
        'Content-Type':' ', 
    }, 
    data:pic//图像base64字符串去头等处理后的图片信息blob 
}).success(function(data2){ 
    $scope.imgSrc=data.Url;//将服务器的数据的url赋值图片链接 
}).error(function(err2,header2,config2,status2){//处理响应失败 
    console.log(err2,header2,config2,status2); 
}); 
注意:

此时请求的url是第一次请求返回的一个固定地址(我这里是--data.UrlForPut)。

头部信息处避免阿里云上传时报错写成'Content-Type':' '或者根据阿里云要求上传header。

第二次请求成功后图片的地址是第一次返回的该图像的地址(此处是个大坑,data.Url不要写成data2.Url了)。

五、此时应该都ok了,好好欣赏靓照吧!

最后附上完整代码,望指教!
友情提示:在复制代码测试时请求参数自己加上哦!

<style>

div{text-align:center;border:1px solid #ddd;}

button,div{margin:10px auto}

button{border:0;width:200px;height:30px;line-height:30px;font-size:1pc;color:#333;background-color:#0ff;cursor:pointer;border-radius:5px}

button:hover{background-color:#db7093}

#preview,.show-img{width:200px;height:200px;}

#preview img,.show-img img{width:100%;height:100%;}

.file{position:relative;display:block;width:200px;height:30px;line-height:30px;background:#9acd32;border-radius:5px;margin:10px auto;overflow:hidden;color:#1e88c7;text-decoration:none;text-indent:0}

.file input{position:absolute;font-size:75pt;right:0;top:0;opacity:0}

.file:hover{background:#aadffd;border-color:#78c3f3;color:#004974;text-decoration:none}

</style>

</head>

<body>

<div ng-controller="photos">

<a href="javascript:;" class="file">

<span>选择文件</span>

<input type="file" onchange="preview(this)" />

</a>

<button class="save" ng-click="save()">保存</button>

<h2>头像预览</h2>

<div id="preview"></div>

<h2>上传成功后展示头像</h2>

<div class="show-img">

<img ng-src={{imgSrc}} alt=""/>

</div>

</div>

<script type="text/javascript" src="//cdn.bootcss.com/jquery/1.11.3/jquery.min.js"></script>

<script src="http://apps.bdimg.com/libs/angular.js/1.4.6/angular.min.js"></script>

<script>

function preview(file) {//预览图片得到图片base64

var prevDiv = document.getElementById('preview');

if (file.files && file.files[0]) {

var reader = new FileReader();

reader.onload = function(evt){

prevDiv.innerHTML = '<img src="' + evt.target.result + '" />';

}

reader.readAsDataURL(file.files[0]);

} else {

prevDiv.innerHTML = '<div class="img" style="filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod=scale,src=\'' + file.value + '\'"></div>';

}

}

//以上代码最好写在service或factory里

angular.module('webPhotos',['ng'])

.controller('photos',function($scope,$http){

var binaryblob = function (s, type) {//blob对象

var byteString = atob(s);

var array = [];

for (var i = 0; i < byteString.length; i++) {

array.push(byteString.charCodeAt(i));

}

return new Blob([new Int8Array(array)], {type: type});

};

var binaryPictureBlob = function (dataUrl, filterHead) {//上传base64去头

var s = filterHead ? dataUrl.replace(/^data:image\/(png|jpeg|pjpeg|bmp|gif|x-png);base64,/, "") : dataUrl;

return binaryblob(s, "image/jpeg");

};

$scope.save=function(){//保存

var pic=binaryPictureBlob($('#preview img').attr('src'),true);//调用该方法得到上传数据

$http({//接口参数

url:'',

method:'',

headers:{},

data:{}

}).success(function(data){//此时上传到本地服务器成功,实际上只是上传了与此图片有关的标记,图片信息还未上传

$http({

method:'PUT',

url:data.UrlForPut,//上传到本地服务器已经生成地址,但要上传到阿里云后地址才生效有上传的图像显示

headers: {

'Content-Type':' ',//避免阿里云上传时报错或者根据阿里云要求上传header

},

data:pic//图像base64字符串去头等处理后的图片信息

}).success(function(data2){//将图像信息从服务器上传到阿里云

$scope.imgSrc=data.Url;//将服务器的数据的url赋值图片链接

}).error(function(err2,header2,config2,status2){//处理响应失败

console.log(err2,header2,config2,status2);

});

}).error(function(err1,header1,config1,status1){//处理响应失败

console.log(err1,header1,config1,status1);

})

}

})

</script>

</body>

</html>

html5 上传头像示例及其注意事项的更多相关文章

  1. html5 上传头像的裁剪

    本示例使用HTML5 canvas,简单的编写了上传头像的裁剪效果,移动端支持拖拽后裁剪, 虽然样式不好看,但是功能还算全: 下图为裁剪后的效果: html部分: <!DOCTYPE html& ...

  2. [实战]MVC5+EF6+MySql企业网盘实战(4)——上传头像

    写在前面 最近又开始忙了,工期紧比较赶,另外明天又要去驾校,只能一个功能一个功能的添加了,也许每次完成的功能确实不算什么,等将功能都实现了,然后在找一个好点的ui对前端重构一下. 系列文章 [EF]v ...

  3. 解决HTML5实现一键拨号、一键发短信及上传头像兼容性问题

    HTML5实现一键拨号,一键发短信以及上传头像等问题都是比较常见的场景,近期在做移动端项目的时候遇到阻挠,通过查找资料解决了问题: 废话不多说,直接上案例代码: HTML5实现一键拨号: <a ...

  4. 手机端 H5上传头像

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  5. PHP+Ajax+plupload无刷新上传头像代码

    很简单的一款PHP+Ajax+plupload无刷新上传头像代码,兼容性很好,可以直接拿来用.你可以自定义各种类型的文件.本实例中只能上传"jpg", "png" ...

  6. jQuery 自制上传头像插件-附带Demo实例(ajaxfileupload.js第三弹)

    这篇文章主要是对前两篇关于ajaxfileupload.js插件的文章 <ASP.NET 使用ajaxfileupload.js插件出现上传较大文件失败的解决方法(ajaxfileupload. ...

  7. JavaWeb -- 文件上传下载示例

    1. 上传简单示例 Jsp <%@ page language="java" import="java.util.*" pageEncoding=&quo ...

  8. day105:Mofang:设置页面初始化&更新头像/上传头像&设置页面显示用户基本信息

    目录 1.设置页面初始化 2.更新头像 1.点击头像进入更新头像界面 2.更新头像页面初始化 3.更新头像页面CSS样式 4.头像上传来源选择:相册/相机 5.调用api提供的本地接口从相册/相机提取 ...

  9. swift上传头像

    很久没有写博客了,今天特地写了这个,也是一边仿照别人写的demo,注释部分都是需要的.需要的同学可以参考一下. @IBAction func headImageBtnPage(){  //上传头像 / ...

随机推荐

  1. Linux 后台开发常用命令

    1.automake编译 autoreconf -isv ./configure make 2.远程获取代码 rsync -aPvr --exclude=*/log/* *.*.*.*::home/s ...

  2. asp.net+mvc+easyui+sqlite 简单用户系统学习之旅(二)—— easyui的简单实用

    下面开始在UserManager.Web中利用easyUI构建web. 1. 先删除自带的controllers.models和views(里面的shared和web.config可以保存)下面的文件 ...

  3. Azure Storage 分块上传

    概述 Azure 存储提供三种类型的 Blob:块 Blob.页 Blob 和追加 Blob.其中,块 Blob 特别适用于存储短的文本或二进制文件,例如文档和媒体文件. 块 Blob 由块组成,每个 ...

  4. Linux 常用命令速查

    0x001 .在指定文件夹下递归查询包含一个字符串的文件(列出的文件内容片段) grep -r   “要查找的串”    文件路径   如  : grep -r  "helloworld&q ...

  5. nginx 404重定向到自定义页面

    在访问时遇到上面这样的404错误页面,我想99%(未经调查,估计数据)的用户会把页面关掉,用户就这样悄悄的流失了.如果此时能有一个漂亮的页面能够引导用户去他想去的地方必然可以留住用户.因此,每一个网站 ...

  6. JaunsGraph数据模型

    JanusGraph采用邻接表(adjacency list)的方式存储图,也即图以顶点(vertex)和其邻接表组成.邻接表中保存某个顶点的所有入射边(incident edges). 通过将图采用 ...

  7. silverlight RadGridView总结系列(转载)

    系列一. RadGridView常用属性总结    1.不可编辑----IsReadOnly="True".    2.不自动增加行----AutoGenerateColumns= ...

  8. 283. Move Zeroes【easy】

    283. Move Zeroes[easy] Given an array nums, write a function to move all 0's to the end of it while ...

  9. 李洪强漫谈iOS开发[C语言-002]-开发概述程序的本质与简单执行过程

    李洪强iOS开发之应用程序的本质与简单执行过程 什么叫程序? 就是一段执行指令 程序的两个状态: 保存状态(保存到硬盘上)   运行状态(由CPU执行) 代码可以执行吗? CPU(中央处理器-> ...

  10. JS方法代理

    作者:Jiang, Jilin JS作为一门脚本语言.十分easy上手.外加其灵活性,能够轻而易举地扩展功能.今天,我们就聊聊JS的方法代理. 方法代理是脚本语言中常见的方法扩展形式.这样的灵活的形式 ...