| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268 |
- <!DOCTYPE html>
- <html>
- <head>
- <title>阿里OSS</title>
- <meta charset="utf-8"/>
- </head>
- <body>
- <form class="form-horizontal" method="post" enctype="multipart/form-data" action="/index.php/admin/application/temp/">
- <!-- <form name=theform > -->
- <input type="radio" name="myradio" value="local_name" checked=true/> 上传文件名字保持本地文件名字
- <input type="radio" name="myradio" value="random_name"/> 上传文件名字是随机文件名, 后缀保留
- </form>
- <h4>您所选择的文件列表:</h4>
- <div id="ossfile">你的浏览器不支持flash,Silverlight或者HTML5!</div>
- <br/>
- <div id="container">
- <a id="selectfiles" href="javascript:void(0);" class='btn'>选择文件</a>
- <a id="postfiles" href="javascript:void(0);" class='btn'>开始上传</a>
- </div>
- <pre id="console"></pre>
- <p> </p>
- <script type="text/javascript" src="{{ asset('assets/plupload/js/plupload.full.min.js') }}"></script>
- <script>
- var expire = 0; //初始化过期时间
- /**
- * 发送ajax请求的函数
- * @returns Json 服务器返回的签名
- */
- function send_request() {
- var xmlhttp = null;
- if (window.XMLHttpRequest) {
- xmlhttp = new XMLHttpRequest();
- }
- else if (window.ActiveXObject) {
- xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
- }
- if (xmlhttp != null) {
- var serverUrl = '{{ url('upload/key?dir=') }}';
- xmlhttp.open("GET", serverUrl, false);
- xmlhttp.send(null);
- return xmlhttp.responseText;
- } else {
- alert("Your browser does not support XMLHTTP.");
- }
- }
- /**
- * 选择服务器端保存文件名的方式
- */
- function check_object_radio() {
- var tt = document.getElementsByName('myradio');
- for (var i = 0; i < tt.length; i++) {
- if (tt[i].checked) {
- g_object_name_type = tt[i].value;
- break;
- }
- }
- }
- /**
- * 从服务器获取签名之后,定义全局变量
- * @returns {boolean}
- */
- function get_signature() {
- //可以判断当前expire是否超过了当前时间,如果超过了当前时间,就重新取一下.3s 做为缓冲
- now = timestamp = Date.parse(new Date()) / 1000;
- if (expire < now + 3) {
- body = send_request(); //发送ajax请求
- var obj = eval("(" + body + ")");
- //定义全局变量,值为服务器返回来的值
- host = obj['host'];
- policyBase64 = obj['policy'];
- accessid = obj['accessid'];
- signature = obj['signature'];
- expire = parseInt(obj['expire']);
- callbackbody = obj['callback'];
- key = obj['dir'];
- return true;
- }
- return false;
- }
- /**
- * 生成随机文件名,不一定能唯一
- * @param len 名字的长度
- * @returns {string}
- */
- function random_string(len) {
- len = len || 32;
- var chars = 'ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678';
- var maxPos = chars.length;
- var pwd = '';
- for (i = 0; i < len; i++) {
- pwd += chars.charAt(Math.floor(Math.random() * maxPos));
- }
- return pwd;
- }
- /**
- *
- * @param filename
- * @returns {string}
- */
- function get_suffix(filename) {
- pos = filename.lastIndexOf('.');
- suffix = '';
- if (pos != -1) {
- suffix = filename.substring(pos)
- }
- return suffix;
- }
- /**
- * 根据选择文件名的方式处理文件名
- * @param filename
- * @returns {string}
- */
- function calculate_object_name(filename) {
- if (g_object_name_type == 'local_name') {
- g_object_name += "${filename}"
- }
- else if (g_object_name_type == 'random_name') {
- suffix = get_suffix(filename);
- g_object_name = key + random_string(10) + suffix
- }
- return '';
- }
- //获取上传文件的名字
- function get_uploaded_object_name(filename) {
- if (g_object_name_type == 'local_name') {
- tmp_name = g_object_name;
- tmp_name = tmp_name.replace("${filename}", filename);
- return tmp_name;
- }
- else if (g_object_name_type == 'random_name') {
- return g_object_name;
- }
- }
- //设置文件上传到OSS需要的参数
- function set_upload_param(up, filename, ret) {
- if (ret == false) { //如果没有签名,去请求请求签名
- ret = get_signature()
- }
- g_object_name = key; //
- if (filename != '') {
- suffix = get_suffix(filename);
- calculate_object_name(filename)
- }
- new_multipart_params = {
- 'key': g_object_name,
- 'policy': policyBase64,
- 'OSSAccessKeyId': accessid,
- 'success_action_status': '200', //让服务端返回200,不然,默认会返回204
- 'callback': callbackbody,
- 'signature': signature
- };
- up.setOption({
- 'url': host,
- 'multipart_params': new_multipart_params
- });
- up.start();
- }
- //文件上传对象
- var uploader = new plupload.Uploader({
- runtimes: 'html5,flash,silverlight,html4', //设置支持上传的协议
- browse_button: 'selectfiles',
- //multi_selection: false, //是否允许多文件上传
- container: document.getElementById('container'),
- flash_swf_url: '{{ asset('plupload/js/Moxie.swf') }}',
- silverlight_xap_url: '{{ asset('plupload/js/Moxie.xap') }}',
- url: 'http://oss.aliyuncs.com',
- //文件过滤规则
- filters: {
- mime_types: [ //只允许上传图片和zip文件
- {title: "Image files", extensions: "jpg,gif,png,bmp"},
- {title: "Zip files", extensions: "zip,rar"}
- ],
- max_file_size: '3mb', //最大只能上传3mb的文件
- prevent_duplicates: true //不允许选取重复文件
- },
- //执行上传的对象
- init: {
- //一初始化就执行的函数
- PostInit: function () {
- document.getElementById('ossfile').innerHTML = '';
- document.getElementById('postfiles').onclick = function () {
- set_upload_param(uploader, '', false);
- return false;
- };
- },
- //一选择文件就执行的函数
- FilesAdded: function (up, files) {
- plupload.each(files, function (file) {
- document.getElementById('ossfile').innerHTML += '<div id="' + file.id + '">' + file.name + ' (' + plupload.formatSize(file.size) + ')<b></b>'
- + '<div class="progress"><div class="progress-bar" style="width: 0%"></div></div>'
- + '</div>';
- });
- },
- //上传之前执行的函数
- BeforeUpload: function (up, file) {
- check_object_radio(); //选择文件名
- set_upload_param(up, file.name, true); //设置上传参数
- },
- //上传进度条
- UploadProgress: function (up, file) {
- var d = document.getElementById(file.id);
- d.getElementsByTagName('b')[0].innerHTML = '<span>' + file.percent + "%</span>";
- var prog = d.getElementsByTagName('div')[0];
- var progBar = prog.getElementsByTagName('div')[0]
- progBar.style.width = 2 * file.percent + 'px';
- progBar.setAttribute('aria-valuenow', file.percent);
- },
- //执行文件上传
- FileUploaded: function (up, file, info) {
- if (info.status == 200) {
- document.getElementById(file.id).getElementsByTagName('b')[0].innerHTML = 'upload to oss success, object name:' + get_uploaded_object_name(file.name) + ' 回调服务器返回的内容是:' + info.response;
- }
- else if (info.status == 203) {
- document.getElementById(file.id).getElementsByTagName('b')[0].innerHTML = '上传到OSS成功,但是oss访问用户设置的上传回调服务器失败,失败原因是:' + info.response;
- }
- else {
- document.getElementById(file.id).getElementsByTagName('b')[0].innerHTML = info.response;
- }
- },
- //报错信息
- Error: function (up, err) {
- if (err.code == -600) {
- document.getElementById('console').appendChild(document.createTextNode("\n选择的文件太大了,可以根据应用情况,在upload.js 设置一下上传的最大大小"));
- }
- else if (err.code == -601) {
- document.getElementById('console').appendChild(document.createTextNode("\n选择的文件后缀不对,可以根据应用情况,在upload.js进行设置可允许的上传文件类型"));
- }
- else if (err.code == -602) {
- document.getElementById('console').appendChild(document.createTextNode("\n这个文件已经上传过一遍了"));
- }
- else {
- document.getElementById('console').appendChild(document.createTextNode("\nError xml:" + err.response));
- }
- }
- }
- });
- uploader.init();
- </script>
- </body>
- </html>
|