test.blade.php 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <title>阿里OSS</title>
  5. <meta charset="utf-8"/>
  6. </head>
  7. <body>
  8. <form class="form-horizontal" method="post" enctype="multipart/form-data" action="/index.php/admin/application/temp/">
  9. <!-- <form name=theform > -->
  10. <input type="radio" name="myradio" value="local_name" checked=true/> 上传文件名字保持本地文件名字
  11. <input type="radio" name="myradio" value="random_name"/> 上传文件名字是随机文件名, 后缀保留
  12. </form>
  13. <h4>您所选择的文件列表:</h4>
  14. <div id="ossfile">你的浏览器不支持flash,Silverlight或者HTML5!</div>
  15. <br/>
  16. <div id="container">
  17. <a id="selectfiles" href="javascript:void(0);" class='btn'>选择文件</a>
  18. <a id="postfiles" href="javascript:void(0);" class='btn'>开始上传</a>
  19. </div>
  20. <pre id="console"></pre>
  21. <p>&nbsp;</p>
  22. <script type="text/javascript" src="{{ asset('assets/plupload/js/plupload.full.min.js') }}"></script>
  23. <script>
  24. var expire = 0; //初始化过期时间
  25. /**
  26. * 发送ajax请求的函数
  27. * @returns Json 服务器返回的签名
  28. */
  29. function send_request() {
  30. var xmlhttp = null;
  31. if (window.XMLHttpRequest) {
  32. xmlhttp = new XMLHttpRequest();
  33. }
  34. else if (window.ActiveXObject) {
  35. xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
  36. }
  37. if (xmlhttp != null) {
  38. var serverUrl = '{{ url('upload/key?dir=') }}';
  39. xmlhttp.open("GET", serverUrl, false);
  40. xmlhttp.send(null);
  41. return xmlhttp.responseText;
  42. } else {
  43. alert("Your browser does not support XMLHTTP.");
  44. }
  45. }
  46. /**
  47. * 选择服务器端保存文件名的方式
  48. */
  49. function check_object_radio() {
  50. var tt = document.getElementsByName('myradio');
  51. for (var i = 0; i < tt.length; i++) {
  52. if (tt[i].checked) {
  53. g_object_name_type = tt[i].value;
  54. break;
  55. }
  56. }
  57. }
  58. /**
  59. * 从服务器获取签名之后,定义全局变量
  60. * @returns {boolean}
  61. */
  62. function get_signature() {
  63. //可以判断当前expire是否超过了当前时间,如果超过了当前时间,就重新取一下.3s 做为缓冲
  64. now = timestamp = Date.parse(new Date()) / 1000;
  65. if (expire < now + 3) {
  66. body = send_request(); //发送ajax请求
  67. var obj = eval("(" + body + ")");
  68. //定义全局变量,值为服务器返回来的值
  69. host = obj['host'];
  70. policyBase64 = obj['policy'];
  71. accessid = obj['accessid'];
  72. signature = obj['signature'];
  73. expire = parseInt(obj['expire']);
  74. callbackbody = obj['callback'];
  75. key = obj['dir'];
  76. return true;
  77. }
  78. return false;
  79. }
  80. /**
  81. * 生成随机文件名,不一定能唯一
  82. * @param len 名字的长度
  83. * @returns {string}
  84. */
  85. function random_string(len) {
  86. len = len || 32;
  87. var chars = 'ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678';
  88. var maxPos = chars.length;
  89. var pwd = '';
  90. for (i = 0; i < len; i++) {
  91. pwd += chars.charAt(Math.floor(Math.random() * maxPos));
  92. }
  93. return pwd;
  94. }
  95. /**
  96. *
  97. * @param filename
  98. * @returns {string}
  99. */
  100. function get_suffix(filename) {
  101. pos = filename.lastIndexOf('.');
  102. suffix = '';
  103. if (pos != -1) {
  104. suffix = filename.substring(pos)
  105. }
  106. return suffix;
  107. }
  108. /**
  109. * 根据选择文件名的方式处理文件名
  110. * @param filename
  111. * @returns {string}
  112. */
  113. function calculate_object_name(filename) {
  114. if (g_object_name_type == 'local_name') {
  115. g_object_name += "${filename}"
  116. }
  117. else if (g_object_name_type == 'random_name') {
  118. suffix = get_suffix(filename);
  119. g_object_name = key + random_string(10) + suffix
  120. }
  121. return '';
  122. }
  123. //获取上传文件的名字
  124. function get_uploaded_object_name(filename) {
  125. if (g_object_name_type == 'local_name') {
  126. tmp_name = g_object_name;
  127. tmp_name = tmp_name.replace("${filename}", filename);
  128. return tmp_name;
  129. }
  130. else if (g_object_name_type == 'random_name') {
  131. return g_object_name;
  132. }
  133. }
  134. //设置文件上传到OSS需要的参数
  135. function set_upload_param(up, filename, ret) {
  136. if (ret == false) { //如果没有签名,去请求请求签名
  137. ret = get_signature()
  138. }
  139. g_object_name = key; //
  140. if (filename != '') {
  141. suffix = get_suffix(filename);
  142. calculate_object_name(filename)
  143. }
  144. new_multipart_params = {
  145. 'key': g_object_name,
  146. 'policy': policyBase64,
  147. 'OSSAccessKeyId': accessid,
  148. 'success_action_status': '200', //让服务端返回200,不然,默认会返回204
  149. 'callback': callbackbody,
  150. 'signature': signature
  151. };
  152. up.setOption({
  153. 'url': host,
  154. 'multipart_params': new_multipart_params
  155. });
  156. up.start();
  157. }
  158. //文件上传对象
  159. var uploader = new plupload.Uploader({
  160. runtimes: 'html5,flash,silverlight,html4', //设置支持上传的协议
  161. browse_button: 'selectfiles',
  162. //multi_selection: false, //是否允许多文件上传
  163. container: document.getElementById('container'),
  164. flash_swf_url: '{{ asset('plupload/js/Moxie.swf') }}',
  165. silverlight_xap_url: '{{ asset('plupload/js/Moxie.xap') }}',
  166. url: 'http://oss.aliyuncs.com',
  167. //文件过滤规则
  168. filters: {
  169. mime_types: [ //只允许上传图片和zip文件
  170. {title: "Image files", extensions: "jpg,gif,png,bmp"},
  171. {title: "Zip files", extensions: "zip,rar"}
  172. ],
  173. max_file_size: '3mb', //最大只能上传3mb的文件
  174. prevent_duplicates: true //不允许选取重复文件
  175. },
  176. //执行上传的对象
  177. init: {
  178. //一初始化就执行的函数
  179. PostInit: function () {
  180. document.getElementById('ossfile').innerHTML = '';
  181. document.getElementById('postfiles').onclick = function () {
  182. set_upload_param(uploader, '', false);
  183. return false;
  184. };
  185. },
  186. //一选择文件就执行的函数
  187. FilesAdded: function (up, files) {
  188. plupload.each(files, function (file) {
  189. document.getElementById('ossfile').innerHTML += '<div id="' + file.id + '">' + file.name + ' (' + plupload.formatSize(file.size) + ')<b></b>'
  190. + '<div class="progress"><div class="progress-bar" style="width: 0%"></div></div>'
  191. + '</div>';
  192. });
  193. },
  194. //上传之前执行的函数
  195. BeforeUpload: function (up, file) {
  196. check_object_radio(); //选择文件名
  197. set_upload_param(up, file.name, true); //设置上传参数
  198. },
  199. //上传进度条
  200. UploadProgress: function (up, file) {
  201. var d = document.getElementById(file.id);
  202. d.getElementsByTagName('b')[0].innerHTML = '<span>' + file.percent + "%</span>";
  203. var prog = d.getElementsByTagName('div')[0];
  204. var progBar = prog.getElementsByTagName('div')[0]
  205. progBar.style.width = 2 * file.percent + 'px';
  206. progBar.setAttribute('aria-valuenow', file.percent);
  207. },
  208. //执行文件上传
  209. FileUploaded: function (up, file, info) {
  210. if (info.status == 200) {
  211. document.getElementById(file.id).getElementsByTagName('b')[0].innerHTML = 'upload to oss success, object name:' + get_uploaded_object_name(file.name) + ' 回调服务器返回的内容是:' + info.response;
  212. }
  213. else if (info.status == 203) {
  214. document.getElementById(file.id).getElementsByTagName('b')[0].innerHTML = '上传到OSS成功,但是oss访问用户设置的上传回调服务器失败,失败原因是:' + info.response;
  215. }
  216. else {
  217. document.getElementById(file.id).getElementsByTagName('b')[0].innerHTML = info.response;
  218. }
  219. },
  220. //报错信息
  221. Error: function (up, err) {
  222. if (err.code == -600) {
  223. document.getElementById('console').appendChild(document.createTextNode("\n选择的文件太大了,可以根据应用情况,在upload.js 设置一下上传的最大大小"));
  224. }
  225. else if (err.code == -601) {
  226. document.getElementById('console').appendChild(document.createTextNode("\n选择的文件后缀不对,可以根据应用情况,在upload.js进行设置可允许的上传文件类型"));
  227. }
  228. else if (err.code == -602) {
  229. document.getElementById('console').appendChild(document.createTextNode("\n这个文件已经上传过一遍了"));
  230. }
  231. else {
  232. document.getElementById('console').appendChild(document.createTextNode("\nError xml:" + err.response));
  233. }
  234. }
  235. }
  236. });
  237. uploader.init();
  238. </script>
  239. </body>
  240. </html>