需求:點擊選擇圖片(可選多張),肯定後將選擇的圖片顯示在頁面上,點擊提交將圖片提交給後臺。css
效果圖:html
- <label>請選擇一個圖像文件:</label>
- <input type="file" id="pic_selector" multiple/>
- <button>提交</button>
html內容,主要是multiple屬性,支持選擇多個文件。是HTML5屬性,注意兼容問題(IOS支持,安卓不支持)。java
js內容:jquery
- function readFile(){
- dataArr = { data : [] };
- fd = new FormData();
- var iLen = this.files.length;
- for(var i=0;i<iLen;i++){
- if (!input['value'].match(/.jpg|.gif|.png|.bmp/i)){
- return alert("上傳的圖片格式不正確,請從新選擇");
- }
- var reader = new FileReader();
- fd.append(i,this.files[i]);
- reader.readAsDataURL(this.files[i]);
- var fileName = this.files[i].name;
- reader.onload = function(e){
- var imgMsg = {
- name : fileName,
- base64 : this.result
- }
- dataArr.data.push(imgMsg);
- result = '<div style="display:none" class="result" ><img src="'+this.result+'" alt=""/></div>';
- div = document.createElement('div');
- div.innerHTML = result;
- div['className'] = 'float';
- document.getElementsByTagName('body')[0].appendChild(div);
- var img = div.getElementsByTagName('img')[0];
- img.onload = function(){
- var nowHeight = ReSizePic(this);
- this.parentNode.style.display = 'block';
- var oParent = this.parentNode;
- if(nowHeight){
- oParent.style.paddingTop = (oParent.offsetHeight - nowHeight)/2 + 'px';
- }
- }
- }
- }
- }
以上函數實現選擇圖片並顯示在桌面上,其中img.onload的做用是將選中的圖片進行縮放,放在寬高相等的div中並居中顯示,可根據本身需求刪除這句。
下面附上ReSizePic函數ajax
- function ReSizePic(ThisPic) {
- var RePicWidth = 200;
-
- var TrueWidth = ThisPic.width;
- var TrueHeight = ThisPic.height;
-
- if(TrueWidth>TrueHeight){
-
- var reWidth = RePicWidth;
- ThisPic.width = reWidth;
-
- var nowHeight = TrueHeight * (reWidth/TrueWidth);
- return nowHeight;
- }else{
-
- var reHeight = RePicWidth;
- ThisPic.height = reHeight;
- }
- }
以上就實現了圖片選擇展現,並將所選圖片轉成base64保存在dataArr中,以後用ajax上傳便可。json
- function send(){
- $.ajax({
- url : 'http://...',
- type : 'post',
- data : dataArr,
- dataType: 'json',
-
-
- success : function(data){
- console.log('返回的數據:'+JSON.stringify(data))
- }
- })
- }
-
- var oBtn = document.getElementsByTagName('button')[0];
- oBtn.onclick=function(){
- if(!input.files.length){
- return alert('請先選擇文件');
- }
- send();
- }
至於用FormData上傳,方法大同小異,這裏再也不演示了。瀏覽器
下面是完整代碼app
- <!DOCTYPE html>
- <html>
- <head>
- <meta charset="UTF-8">
- <title>showImages</title>
- <style type="text/css">
- .float{
- float:left;
- width : 200;
- height: 200;
- overflow: hidden;
- border: 1px solid #CCCCCC;
- border-radius: 10px;
- padding: 5px;
- margin: 5px;
- }
- img{
- position: relative;
- }
- .result{
- width: 200px;
- height: 200px;
- text-align: center;
- box-sizing: border-box;
- }
-
- </style>
-
-
- <script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script>
- <script type="text/javascript">
-
-
- window.onload = function(){
- var input = document.getElementById("file_input");
- var result,div;
-
- if(typeof FileReader==='undefined'){
- result.innerHTML = "抱歉,你的瀏覽器不支持 FileReader";
- input.setAttribute('disabled','disabled');
- }else{
- input.addEventListener('change',readFile,false);
- } //handler
-
-
-
-
- var dataArr = null; //直接傳base64數據
- var fd = null; //FormData方式發送請求
-
- function readFile(){
- dataArr = { data : [] };
- fd = new FormData();
- var iLen = this.files.length;
- for(var i=0;i<iLen;i++){
- if (!input['value'].match(/.jpg|.gif|.png|.bmp/i)){ //判斷上傳文件格式
- return alert("上傳的圖片格式不正確,請從新選擇");
- }
- var reader = new FileReader();
- fd.append(i,this.files[i]);
- reader.readAsDataURL(this.files[i]); //轉成base64
- var fileName = this.files[i].name;
- reader.onload = function(e){
- var imgMsg = {
- name : fileName,//獲取文件名
- base64 : this.result //reader.readAsDataURL方法執行完後,base64數據儲存在reader.result裏
- }
- dataArr.data.push(imgMsg);
- result = '<div style="display:none" class="result" ><img src="'+this.result+'" alt=""/></div>';
- div = document.createElement('div');
- div.innerHTML = result;
- div['className'] = 'float';
- document.getElementsByTagName('body')[0].appendChild(div); //插入dom樹
- var img = div.getElementsByTagName('img')[0];
- img.onload = function(){
- var nowHeight = ReSizePic(this); //設置圖片大小
- this.parentNode.style.display = 'block';
- var oParent = this.parentNode;
- if(nowHeight){
- oParent.style.paddingTop = (oParent.offsetHeight - nowHeight)/2 + 'px';
- }
- }
- }
- }
-
-
- }
-
-
- function send(){
- $.ajax({
- url : 'http://123.206.89.242:9999',
- type : 'post',
- data : dataArr,
- dataType: 'json',
- //processData: false, 用FormData傳fd時需有這兩項
- //contentType: false,
- success : function(data){
- console.log('返回的數據:'+JSON.stringify(data))
- }
- })
- }
-
- var oBtn = document.getElementsByTagName('button')[0];
- oBtn.onclick=function(){
- if(!input.files.length){
- return alert('請先選擇文件');
- }
- send();
- }
- }
- /*
- 用ajax發送fd參數時要告訴jQuery不要去處理髮送的數據,
- 不要去設置Content-Type請求頭才能夠發送成功,不然會報「Illegal invocation」的錯誤,
- 也就是非法調用,因此要加上「processData: false,contentType: false,」
- * */
-
-
- function ReSizePic(ThisPic) {
- var RePicWidth = 200; //這裏修改成您想顯示的寬度值
-
- var TrueWidth = ThisPic.width; //圖片實際寬度
- var TrueHeight = ThisPic.height; //圖片實際高度
-
- if(TrueWidth>TrueHeight){
- //寬大於高
- var reWidth = RePicWidth;
- ThisPic.width = reWidth;
- //垂直居中
- var nowHeight = TrueHeight * (reWidth/TrueWidth);
- return nowHeight; //將圖片修改後的高度返回,供垂直居中用
- }else{
- //寬小於高
- var reHeight = RePicWidth;
- ThisPic.height = reHeight;
- }
- }
-
-
-
- </script>
- </head>
- <body ng-controller="Aaa" >
- <div class="container">
- <label>請選擇一個圖像文件:</label>
- <input type="file" id="file_input" multiple/>
- <button>提交</button>
- </div>
- </body>
- </html>