七牛云上传--官方JSDK与photoClip截图Base64编码
来源:互联网 发布:import 引入js 编辑:程序博客网 时间:2024/06/08 09:40
主要
1、php后台生成七牛云uploadtoken
2、前端使用官方JSDK上传原图
3、photoClip截图 生成Base64图片
4、上传base64 编码图片到七牛云
php后台生成uploadtoken
下载php的SDK,然后引用SDK中的Auth即可:
七牛云官方php的SDK
use Think\Controller;use Qiniu\Auth;use Qiniu\Storage\UploadManager;use Org\Net\Http;class QiniuLogic extends Controller{ public function get_token(){ $accessKey = C("QINIU_ACCESS"); //这个是七牛云账号的access $secretKey = C("QINIU_SECRET"); //这个是七牛云账号的secret $bucket = C("QINIU_BUCKET"); //这个是七牛云的内容空间 vendor("Qiniu/autoload"); $auth = new Auth($accessKey, $secretKey); $policy = array( "scope"=>$bucket.":".$accessKey, "insertOnly"=>0 ); $uptoken = $auth->uploadToken($bucket, null, 36000, $policy); $this->assign("QiniuToken",$uptoken); //我们要的token,必需 $this->assign("QiniuDomain",C("QINIU_DOMAIN")); //这个是cname后的域名,非必须 }}
前端页面使用官方JSDK上传原图
首先,下载一个官方的JSDK
然后在html页面中引用js,官方文档中引用的比较多,这里引用两个:plupload.full.min.js和qiniu.min.js就够用了。
上传过程中可能出现地域的问题:
常见问题处理
html页面
<div> <img id="image" src='{$gradeImg}' /> <input type="hidden" id="qiniu-uptoken" value="{$QiniuToken}"> <input type="hidden" id="qiniu-domain" value="{$QiniuDomain}"> <input type="hidden" id="image_original" value="{$gradeImg}"> </div> <!--七牛云直接上传,这里可以参考官方的文档--> <div id="qiniu-upload-container" style="display: none;"> <button id="qiniu-upload-btn" class="btn btn-success"> 上传 </button> <div id="fsUploadProgress"> </div> </div> <!--七牛云直接上传end--> <!--七牛云图直接上传,upload.js 是自己需要写的,其它两个是SDK文件的--><script src="../qiniu/plupload/plupload.full.min.js"></script><script src="../qiniu/dist/qiniu.min.js"></script><script src="../qiniu/js/upload.js"></script><!--七牛云图直接上传end-->
JavaScript-upload.js
官方文档中有很多内容,这里做了一些简化:
主要修改‘FileUploaded’,‘key’和 randStr() 方法
$(function () { var uploader = Qiniu.uploader({ runtimes: 'html5,flash,html4', browse_button: 'qiniu-upload-btn', container: 'qiniu-upload-container', drop_element: '', max_file_size: '10mb', flash_swf_url: 'bower_components/plupload/js/Moxie.swf', dragdrop: false, chunk_size: '2mb', multi_selection: !(mOxie.Env.OS.toLowerCase()==="ios"), uptoken: $('#qiniu-uptoken').val(), domain: $('#qiniu-domain').val(), get_new_uptoken: false, auto_start: true, log_level: 5, init: { 'FilesAdded': function(up, files) { $("#qiniu-upload-btn").html("正在上传中..."); $("#qiniu-upload-btn").attr("disabled",true); }, 'FileUploaded': function(up, file, info) { //主要是这个方法 var res = $.parseJSON(info); var image = $("#qiniu-domain").val()+res.key; $("#image_original").val(image); var thumb = image+"?imageView2/2/w/500/h/300"; $("#image").attr("src",thumb); $("#qiniu-upload-btn").html("重新上传"); $("#qiniu-upload-btn").attr("disabled",false); }, 'UploadProgress': function(up, file) { }, 'Error': function(up, err, errTip) { $("#qiniu-upload-btn").html("重新上传"); $("#qiniu-upload-btn").attr("disabled",false); alert("上传失败!请重试!"); } , 'Key': function(up, file) {//在这里可以改变文件的名称和路径 var key = "public/"; var now = new Date(); key += now.getFullYear().toString()+(now.getMonth()+1).toString()+"/"+now.getDate()+"/"+now.getHours()+"/"; key += randStr()+".png"; return key } } }); uploader.bind('FileUploaded', function() { console.log('hello man,a file is uploaded'); });});function randStr() {//这个是为了生成随机字符串用的 var str = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; var n = 10, s = ""; for(var i = 0; i < n; i++){ var rand = Math.floor(Math.random() * str.length); s += str.charAt(rand); } return s;}
photoClip截图 生成Base64图片
首先下载jQueryphotoClip插件
然后引入js文件,编写html布局
最后js实现
注:js代码中涉及到一个弹窗插件layer,很简单,引用一个js就行了。
html页面
<style> .load_mask{ position: absolute; width: 100%; height: 100%; text-align: center; padding-top: 30%;background-color: #fffeff;z-index: 100;opacity: 0.9;display: none;} #loadText{margin-top: 20px;font-size: 20px;} #img_show{position: fixed;width: 100%;height: 100%;top: 0;left: 0;background-color: #0c0c0c;z-index: 100;display: none;} #img_show .sn-operation-content{position: absolute;z-index: 99;text-align: center;width: 100%;bottom:10%;} #img_show .btn{margin: 0 10px;} .shunshizhen{ width: 30px; height: 30px; position: absolute; z-index: 99; color: #ffffff; line-height: 30px; font-size: 30px; left: 48%; top: 10%;} </style> <div class="load_mask"> <img src="../images/icon/loading.gif" alt="" class="t_loadImg"> <div id="loadText">图片剪裁中...</div> </div> <div id="img_show"> <div class="sn-operation-content"> <a class="sn-photoclip-cancel btn btn-white">取消</a> <a class="sn-photoclip-ok btn btn-danger">选取</a> </div> <i class="icon-repeat shunshizhen"></i> </div> <div> <img id="image" src='{$gradeImg}' /> <input type="hidden" id="qiniu-uptoken" value="{$QiniuToken}"> <input type="hidden" id="qiniu-domain" value="{$QiniuDomain}"> <input type="hidden" id="image_original" value="{$gradeImg}"> </div> <!--截图上传--> <div id="mm-photoclip"> <input type="file" id="file" accept="image/*" /> <label for="file" class="btn btn-success">上传</label> </div> <!--截图上传end--><script src="../common/layer/layer.min.js"></script><script src="../photoclip/iscroll-zoom.js"></script><script src="../photoclip/hammer.js"></script><script src="../photoclip/lrz.all.bundle.js"></script><script src="../photoclip/jquery.photoClip.js"></script><!--base64.js 和 upload_image.js 自己写--><script src="../base64.js"></script><script src="../upload_image.js"></script>
upload_image.js
代码中有很详细的注释,就不解释了
注:1、clipArea.shunshizhen();这个是图片顺时针的效果方法,要自己去改jquery.photoClip.js 文件。因为这个不在文章的内容范围,就不解释了。
2、photoClip插件有个兼容性的问题,还是得自己去改。
3、putb64()这是一个上传base64图片到七牛云的方法,后面会讲。
var file_name;$(function () { var obj; var clipArea = new bjj.PhotoClip("#img_show", { size: [200, 272], // 截取框的宽和高组成的数组。默认值为[260,260] adaptive: null, // 截取框自适应,截取框宽和高的百分比组成的数组。默认为 null。如果设置了该参数,且值有效,则会忽略 size 的大小设置,size 中的值仅用于计算宽高比。当设置了其中一个值得百分比时,如果另一个未设置,则将会按 size 中的比例等比缩放。 outputSize: [200,272], // 输出图像的宽和高组成的数组。默认值为[0,0],表示输出图像原始大小 outputType: "jpg", // 指定输出图片的类型,可选 "jpg" 和 "png" 两种种类型,默认为 "jpg" outputQuality: .8, // 输出质量,取值 0 - 1,默认为0.8。(这个质量不是最终输出的质量,与 lrzOption.quality 是相乘关系) file: "#file", // 上传图片的<input type="file">控件的选择器或者DOM对象 source: "", // 需要裁剪图片的url地址。该参数表示当前立即开始裁剪的图片,不需要使用 file 控件获取。注意,该参数不支持跨域图片。 view: "", // 显示截取后图像的容器的选择器或者DOM对象 ok: ".sn-photoclip-ok", // 确认截图按钮的选择器或者DOM对象 loadStart: function(file) { obj = this; file_name = file.name; $(".load_mask").show(); $("#loadText").html("图片读取中..."); }, // 开始加载的回调函数。this指向当前 PhotoClip 的实例对象,并将正在加载的 file 对象作为参数传入(如果是使用 source 加载图片,则该参数为图片的 img 对象) loadComplete: function(img) { $("#img_show").fadeIn(250); $(".load_mask").hide(); $("#loadText").html("图片裁剪中..."); $(".shunshizhen").unbind('click').bind("click",function(){ clipArea.shunshizhen(); }); }, // 加载完成的回调函数。this指向当前 PhotoClip 的实例对象,并将图片的 img 对象作为参数传入 loadError: function(event) { show_error("截图插件出错"); }, // 加载失败的回调函数。this指向当前 PhotoClip 的实例对象,并将错误事件的 event 对象作为参数传入 clipFinish: function(dataURL) { // layerIndex1= layer.open({ // type: 2 // ,content: '图片剪裁中' // }); if(!navigator.onLine){ layer.alert("网络不好,请检查网络再上传哟~"); $("#img_show").fadeOut(250); return false; } $(".load_mask").show(); putb64(dataURL); //上传base64图片到七牛云 $("#img_show").fadeOut(250); }, // 裁剪完成的回调函数。this指向当前 PhotoClip 的实例对象,会将裁剪出的图像数据DataURL作为参数传入 lrzOption: { // lrz压缩插件的配置参数 width:500, // 图片最大不超过的宽度,默认为原图宽度,高度不设时会适应宽度。 height: 500, // 图片最大不超过的高度,默认为原图高度,宽度不设时会适应高度。 quality: 1 // 图片压缩质量,取值 0 - 1,默认为0.7。(这个质量不是最终输出的质量,与 outputQuality 是相乘关系) } }); $(".sn-photoclip-cancel").click(function() { $("#img_show").fadeOut(250); });})
上传base64 编码图片到七牛云
官方有相应的说明:如何上传base64编码图片到七牛云
因为我这里有个需求:修改KEY值,就是改变上传文件在七牛上的名字。
这里说得很清楚,可以不用管uptoken.SaveKey , 直接在url后面加个字段并且字段要base64加密
base64.js
js给字符串进行base64编译的。网上一搜一大把:
function str2Base64(str) { var b = new Base64(); return b.encode(str);}function Base64() { // private property _keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; // public method for encoding this.encode = function (input) { var output = ""; var chr1, chr2, chr3, enc1, enc2, enc3, enc4; var i = 0; input = _utf8_encode(input); while (i < input.length) { chr1 = input.charCodeAt(i++); chr2 = input.charCodeAt(i++); chr3 = input.charCodeAt(i++); enc1 = chr1 >> 2; enc2 = ((chr1 & 3) << 4) | (chr2 >> 4); enc3 = ((chr2 & 15) << 2) | (chr3 >> 6); enc4 = chr3 & 63; if (isNaN(chr2)) { enc3 = enc4 = 64; } else if (isNaN(chr3)) { enc4 = 64; } output = output + _keyStr.charAt(enc1) + _keyStr.charAt(enc2) + _keyStr.charAt(enc3) + _keyStr.charAt(enc4); } return output; } // public method for decoding this.decode = function (input) { var output = ""; var chr1, chr2, chr3; var enc1, enc2, enc3, enc4; var i = 0; input = input.replace(/[^A-Za-z0-9\+\/\=]/g, ""); while (i < input.length) { enc1 = _keyStr.indexOf(input.charAt(i++)); enc2 = _keyStr.indexOf(input.charAt(i++)); enc3 = _keyStr.indexOf(input.charAt(i++)); enc4 = _keyStr.indexOf(input.charAt(i++)); chr1 = (enc1 << 2) | (enc2 >> 4); chr2 = ((enc2 & 15) << 4) | (enc3 >> 2); chr3 = ((enc3 & 3) << 6) | enc4; output = output + String.fromCharCode(chr1); if (enc3 != 64) { output = output + String.fromCharCode(chr2); } if (enc4 != 64) { output = output + String.fromCharCode(chr3); } } output = _utf8_decode(output); return output; } // private method for UTF-8 encoding _utf8_encode = function (string) { string = string.replace(/\r\n/g,"\n"); var utftext = ""; for (var n = 0; n < string.length; n++) { var c = string.charCodeAt(n); if (c < 128) { utftext += String.fromCharCode(c); } else if((c > 127) && (c < 2048)) { utftext += String.fromCharCode((c >> 6) | 192); utftext += String.fromCharCode((c & 63) | 128); } else { utftext += String.fromCharCode((c >> 12) | 224); utftext += String.fromCharCode(((c >> 6) & 63) | 128); utftext += String.fromCharCode((c & 63) | 128); } } return utftext; } // private method for UTF-8 decoding _utf8_decode = function (utftext) { var string = ""; var i = 0; var c = c1 = c2 = 0; while ( i < utftext.length ) { c = utftext.charCodeAt(i); if (c < 128) { string += String.fromCharCode(c); i++; } else if((c > 191) && (c < 224)) { c2 = utftext.charCodeAt(i+1); string += String.fromCharCode(((c & 31) << 6) | (c2 & 63)); i += 2; } else { c2 = utftext.charCodeAt(i+1); c3 = utftext.charCodeAt(i+2); string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63)); i += 3; } } return string; }}
put64() 上传base64图片到七牛云
和官方提供的一样,只是修改了一下key值
方法randStr() 用于生成随机的字符串
function putb64(base){ if(!navigator.onLine){ layer.alert("网络不好,请检查网络再上传哟~"); $(".load_mask").hide(); return false; } var token = $("#qiniu-uptoken").val(); var bases = base.split(";base64,"); var pic = bases[1]; var url = "http://upload.qiniu.com/putb64/-1"; //非华东空间需要根据注意事项 1 修改上传域名 var xhr = new XMLHttpRequest(); xhr.onreadystatechange=function(){ if (xhr.readyState==4){ var result = eval('(' + xhr.responseText + ')'); var key = result.key; $(".load_mask").hide(); var image = $("#qiniu-domain").val()+key; $("#image_original").val(image); $("#image").attr("src",image); // success_upload(key,[]); } }; var mm_key = "public/"+randStr()+".png"; mm_key = str2Base64(mm_key); //base64编译 mm_key = mm_key.replace("+","-"); mm_key = mm_key.replace("/","_"); url += "/key/"+mm_key; xhr.open("POST", url, true); xhr.setRequestHeader("Content-Type", "application/octet-stream"); xhr.setRequestHeader("Authorization", "UpToken " + token); xhr.send(pic);}function randStr() { var str = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; var n = 10, s = ""; for(var i = 0; i < n; i++){ var rand = Math.floor(Math.random() * str.length); s += str.charAt(rand); } return s;}
- 七牛云上传--官方JSDK与photoClip截图Base64编码
- 用户头像base64编码上传与保存头像问题
- iOS 图片base64编码 上传
- 采用base64编码上传图片
- base64编码图片上传不了
- 上传base64编码图片到七牛云
- Base64编码与解码
- BASE64编码与解码
- BASE64编码与解码
- Base64编码与解码
- base64编码与解码
- base64编码与解码
- Base64 编码与解码
- Base64编码与解码
- Base64编码与解码
- Base64编码与解码
- base64编码与解码
- BASE64编码与解码
- CCF CSP 201503-1 图像旋转
- Java并发编程与技术内幕:消费者-生产者模式研究
- 百度地图API去获取当前用户地理位置,不过一般都不能很精确的,百度地图的定位都是有偏移量的。
- ubuntu so make
- svn服务器配置
- 七牛云上传--官方JSDK与photoClip截图Base64编码
- 16如何处理不均衡数据
- 用例图、类图与时序图的关系
- 教你解决Android Studio无法查看源码
- HBase中应该如何合理设置客户端Write Buffer
- js声明函数(function)和变量(variable)不得不防的坑
- 表空间、段、区、块
- Python爬虫学习(二)用到的数据结构
- 算法_随机算法1_入门引例(根据随机数求圆周率pi)