圖片尺寸判斷等-我們到底能走多遠系列(21)

來源:互聯網
上載者:User
我們到底能走多遠系列(21)

扯淡:又是一年過年,給各位拜個很早很早的年,實在點的祝福:祝各位明年工資全部翻一番啦!

 

主題:

1,判斷上傳圖片尺寸功能

如下代碼即可在頁面上結果掉這個問題:

var iconElement = $("#photo");var image = new Image();image.src = iconElement.attr("src");var realWidth = image.width;var realHeight = image.height;

但是因為我後續代碼中使用了的外掛程式,導致外掛程式無法正常使用。

 

被迫本人改變了流程:

點擊file按鈕-->選擇圖片-->onchange事件上傳圖片到後台-->後台判斷圖片尺寸-->返回結果

 

上傳圖片的js代碼:根據msg的值來判斷尺寸是否符合。

$.ajaxFileUpload({url:"uploadPreviewImage.html",        secureuri:false,        fileElementId:"advImage",        dataType:"json",        success:function (data , status) {            if(data.msg=="1"){//後台檢測尺寸不符合                alert("圖片大小小於480×520,無法進行裁剪");                return;            }                    },        error:function (data, status, e) {            //alert("圖片上傳失敗,請重新選擇圖片");        }    });

後台判斷代碼:代碼中的實現是先把檔案儲存下來,然後利用BufferedImage 來判斷尺寸,不符合刪除。

其實可以在沒有組建檔案的時候直接進行判斷尺寸,不符合就不用產生檔案了。我這個是比較差的實現:

    public ModelAndView uploadPreviewImage(HttpServletRequest request, HttpServletResponse response) throws IOException{        User user = (User)request.getSession().getAttribute("user");        MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest)request;        MultipartFile image = multipartRequest.getFile("advImage");                response.setCharacterEncoding(BusinessConstants.ENCOD_UTF);        response.setHeader("ContentType", "json");                PrintWriter out = response.getWriter();                // 組合零時圖片名        String imageName = image.getOriginalFilename();        String file_ext = imageName.substring(imageName.lastIndexOf(BusinessConstants.DOT) + 1);        SimpleDateFormat df = new SimpleDateFormat(BusinessConstants.DATE_FORMAT);        String tempImageName = user.getId() +BusinessConstants.UNDERLINE + df.format(new Date()) + BusinessConstants.DOT + file_ext;                        // 存放瀏覽圖片的零時檔案路徑        File file = new File(request.getSession().getServletContext().getRealPath(BusinessConstants.TEMP_PICTURE_PATH +                 tempImageName));                byte[] advImageBytes = null;        InputStream advImageStream = null;        String msg = "0";        try {            file.createNewFile();            advImageStream = image.getInputStream();            advImageBytes = FileCopyUtils.copyToByteArray(advImageStream);            FileCopyUtils.copy(advImageBytes, file);            advImageStream.close();            BufferedImage buff = ImageIO.read(file);             // 判斷圖片大小            if(buff.getWidth() < 480 || buff.getHeight() < 520){                msg="1";                file.delete();            }        } catch (IOException e) {            e.printStackTrace();        }                String tempPath =  BusinessConstants.TEMP_RELATIVE_PICTURE_PATH +          tempImageName;                // 傳給頁面相對路徑        out.print("{");          out.print("tempPath:'"+tempPath+"',");         out.print("msg:'"+msg+"'");         out.print("}");        out.flush();        out.close();         // ajax        return null;    }    

上傳利用的是ajaxupload外掛程式,那麼網上的朋友也有一些遇到過這種問題:就是檔案上傳後,file內的value就清空了,沒有保留。

 

事實上,ajaxFileUpload沒有使用ajax來實現檔案上傳,它只是利用iframe,局部重新整理的方式來類比ajax的效果,這樣就可以理解路徑內容沒有保留了。

那麼是不是我們在上傳完後,把路徑內容重新賦值給這file呢?理論上是可行的,但這個可能牽涉到瀏覽器的安全機制,個人覺得這樣去做有點死胡同的感覺。

那麼問題就是:onchange上傳完檔案 file標籤是空的,體驗上下降不少。結合上面的分析,比較好的做法就是在完成上傳返回後,把file隱藏,顯示上傳成功。這樣的方式很簡單,也不用一直想著怎麼把路徑表現出來了。

至於頁面上的file標籤怎麼隱藏,提示怎麼顯示:

可以利用jquery來操作:

        $('#shopNameId').show();        $('#batchshopNameId').hide();

效果這樣:

上傳前:

上傳後:

點擊重新上傳後:

2,關於頁面checkbox 多選的後操作的問題:

情境是:選中多個checkbox後,進行後台互動,比如刪除這些幾條資料什麼的。

如何取得選中的checkbox的id數組呢?

一下是利用jquery完成的,但是牽涉到瀏覽器問題,所以看到這裡的你,能否提供避開瀏覽器安全色問題的代碼出來呢,謝謝啦。

   var isIE=!!window.ActiveXObject;   var isIE6=isIE&&!window.XMLHttpRequest;   var list = new Array();   if(isIE6){   $("input[type=checkbox][name='chk_id'][checked]" ).each(function(i){        list.push(this.id);    })   }else{    $("input[type=checkbox][name='chk_id']").each(function(){    if($(this).attr("checked") == true){            list.push(this.id);        }   })   }   if(list.length<1){    alert("請先選擇批量修改的資料");      return;   }

 

3,下拉框聯動問題:

頁面上連個下拉框有聯絡,比如省市關係,行業大類小類

選擇大類後小類的下拉框就內容就改變。

下拉框的代碼:開始的時候大類給內容可選擇,選擇後出發js事件,用ajax去後台把對應的小類資料取出顯示:

<select id="parentSelect" name="parentSelect" style="margin:0px 5px; height:20px; line-height:20px;">    <c:forEach items="${industryList}" var="item" varStatus="status">    <option id="${item.id }" value="${item.id }">${item.name }</option>    </c:forEach>    </select>    小類<select id="childSelect" disabled="disabled" name="childSelect" style="margin:0px 5px;height:20px;line-height:20px;">    </select>

 

出發事件的js:

$(document).ready(function(){        $("#parentSelect").change(function(){        var parentId = $(this).find("option:selected").attr("id");        $.post("getChildIndustry.html",{parentId:$(this).find("option:selected").attr("id")},        function(date)        {          $("#childSelect").html('');          $("#industry").html("");//這個其實是一個隱藏的div <div id="industry" style="display: none;"></div>          $(date).appendTo('#industry');          var childList = $("child");               $.each(childList,function(key,val){          var value = document.getElementById(val.id);          var isChrome = window.navigator.userAgent.indexOf("Chrome") !== -1;          var id;          var name;          if(isChrome){          name = value.innerHTML;          }else{            name = value.str;          }          id = val.id;          $('<option value=' + id + '>'+ name + '</option>')          .appendTo('#childSelect'); //添加下拉框          $("#childSelect").attr('disabled', '') //2號下拉框可用         });     });   });  

至於像頁面上預設選中也是比較方便的。

 

總結:

1,有時候,代碼打的快還不如方案選選得好。

2,js一旦牽涉到相容問題就頭大,看來頁面的編碼還真是一般人幹不了的啊...

 

 

 

 

讓我們繼續前行

----------------------------------------------------------------------

努力不一定成功,但不努力肯定不會成功。
共勉。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.