1. 程式人生 > >Java圖片上傳+回顯技術

Java圖片上傳+回顯技術

前言

先說一下整體得流程,首先需求為給角色上傳頭像,通過新增頁面對使用者新增頭像並回顯,然後填寫資訊後進行表單提交,傳送ajaxfileupload請求給java,java處理相應請求後,將圖片上傳tomcat伺服器,最後將真實路徑存入資料庫,並在前臺JSP調取相對應得img真實路徑,最後顯示在前臺頁面,整體需求完成。

上傳成功與未上傳:

在這裡插入圖片描述

1.通過新增使用者頁面進行圖片選擇,回顯功能

首先,引入功能所需jar包,基礎包在此不再重複,下面只列出關鍵jar包:
在這裡插入圖片描述
下來進入新增頁面,並進行選擇圖片操作:
在這裡插入圖片描述
選擇圖片後,進行圖片與圖片資訊回顯:
在這裡插入圖片描述
jsp程式碼:

<div class="row cl">
    <label class="form-label col-xs-4 col-sm-2">
        <span class="c-red">*</span> 頭像:
    </label>  
     &nbsp;&nbsp;&nbsp;&nbsp;
     <img id="pic3" src="" width="106" alt="">
    <input type='file' style="width: 200px;" name='picPaths3'id='picPaths3'           
    onchange="showPic(this, 3);" />  
</div> 

建立Onchange事件寫JS程式碼:

//圖片回顯+圖片格式+檔案型別
function showPic(obj, id) { 
        var newPreview = document.getElementById('pic'+id); 
        if (obj) { 
            //ie瀏覽器相容 
            if (window.navigator.userAgent.indexOf("MSIE") >= 1) { 
                obj.select(); 
                newPreview.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod=scale);"; 
var path = document.selection.createRange().text;
                var flag = judgeImgSuffix(path);
                if(flag){
                    newPreview.filters.item("DXImageTransform.Microsoft.AlphaImageLoader").src = document.selection.createRange().text;
                }else{
                    alert("要求圖片格式為png,jpg,jpeg,bmp");
                }
return; 
            } 
            //firefox瀏覽器相容 
            else if (window.navigator.userAgent.indexOf("Firefox") >= 1) { 
                if (obj.files) { 
                    newPreview.src = window.URL.createObjectURL(obj.files.item(0)); 
                    return; 
                } 
                newPreview.src = obj.value; 
                        return; 
                    } 
                    newPreview.src = obj.value; 
                    return; 
                } 
            } 
function judgeImgSuffix(path){
                var index = path.lastIndexOf('.');
                var suffix = "";
                if(index > 0){
                    suffix = path.substring(index+1);
                }
                if("png"==suffix || "jpg"==suffix || "jpeg"==suffix || "bmp"==suffix || "PNG"==suffix || "JPG"==suffix || "JPEG"==suffix || "BMP"==suffix){
                    return true;
                }else{
                    return false;
                }

注:此處的方法及引數可以根據實際開發情況進行修改,因博主pic較多,所以使用pic+id得方法進行區分

2.傳送ajaxfileupload請求,後臺接受請求,上傳圖片,提交表單資訊

填寫表單資訊,進行提交確認:
在這裡插入圖片描述
Ajaxfileupload:

//非同步上傳圖片
$.ajaxFileUpload({
                        type:"post",
                        url:contextPath+"/user/addUserInfo.action",
                        secureuri:false,
                        data:{userName:userName, account:account, sex:sex,         
                        password:password,
                        telephone:telephone, unitId:unitId, groupId:groupId 
                        },
                        dataType: 'text',
                        fileElementId:"picPaths3",
                        cache:false,
                        async:false,
                        success:function(data,textStatus,jqXHR){
                            //data是返回的資料
                            //textStatus 可能為"success","notmodified"等
                            //jqXHR 是通過jQuery封裝的XMLHttpRequest物件
                            if(data==1){
                                var msg="資訊新增成功!";
                                var option = {
                                    title: "提示",
                                    btn:parseInt("0011",2),
                                    onOk:function(){
var index = parent.layer.getFrameIndex(
                                    window.name);
                                    parent.location.replace(parent.location
                                    .href);
                                    parent.layer.close(index);
}
                                }
                                window.wxc.xcConfirm(msg, "success", option
                                );
                                }else{
                                window.wxc.xcConfirm("新增資訊時出現異常! ","
                                info");
                                    }
                        },
                        error:function(XMLHttpRequest,textStatus,errorThrow
                        n){
                            window.wxc.xcConfirm("新增資訊時出現異常,異常資訊:
                            "+textStatus,"error");
                            return false;
                            }
                        });

跳轉URL方法後,進入後臺:

/**
     * 使用者資訊頭像上傳功能
     * 
     * @param model
     * @param jspUserCustom
     * @return
     */
    @RequestMapping("addUserInfo")
    public void addUserInfo(PfUserCustom jspUserCustom, String userName,
            String account, String password, Integer sex, String telephone,
            Integer unitId, Integer groupId, HttpSession session,
            HttpServletResponse response, HttpServletRequest request) {
        response.setContentType("text/html;charset=UTF-8");
        int result;
        boolean executeResult = false;
        try {
            jspUserCustom.setUnitName(userName);
            jspUserCustom.setAccount(account);
            jspUserCustom.setSex(sex);
            jspUserCustom.setTelephone(telephone);
            jspUserCustom.setUnitId(unitId);
            jspUserCustom.setGroupId(groupId);
            jspUserCustom.setPassword(Md5Util.string2MD5(
            jspUserCustom.getPassword()).toUpperCase());
            MultipartHttpServletRequest multipartRequest = (MultipartHttpSe
            rvletRequest) request;
            String fileName = "";
            String uploadPath = "wyInFile\\";
            String path = request.getSession().getServletContext().getRealP
            ath(
                    "/")
                    + uploadPath;
            path=path.substring(0,path.indexOf("\\wyin"))+ "\\" + uploadPat
            h;
            /*
             * File uploadPathFile = new File(path); if
             * (!uploadPathFile.exists()) { uploadPathFile.mkdir(); }
             */
            String realPath = "";
            for (Iterator it = multipartRequest.getFileNames(); it.hasNext(
            );) {
                String key = (String) it.next();
                MultipartFile mulfile = multipartRequest.getFile(key);
                //封裝處理檔案工具類Tools
                String pathTmp = Tools.saveFile2(multipartRequest, mulfile)
                ;
                if(!"".equals(pathTmp)){
                    realPath += pathTmp; 
                }
            }
            jspUserCustom.setImage(realPath);
            userService.insertSelective(jspUserCustom);
            result = 1;// 新增成功
            response.getWriter().print(result);
            executeResult = true;
        } catch (Exception e) {
            result = 2;// 出現異常
            try {
                response.getWriter().print(result);
            } catch (IOException e1) {
                e1.printStackTrace();
            }
            executeResult = false;
            e.printStackTrace();
        } finally {   
            //插入操作日誌
            Integer loginUserId = (Integer) session.getAttribute("userId");
            operationLogService.insertOperateLog(loginUserId, 3, executeRes
            ult,request);
        }
    }

注:大家看清楚uploadpath和realpath,一個為訪問圖片路徑,一個為真實伺服器路徑

3.檔案處理工具類

此工具類已封裝完畢,大家可以放心使用,其中的WyInFile為伺服器儲存圖片的路徑

  /**
     * 工具類:上傳檔案:改名字
     */
    public static String saveFile(HttpServletRequest request, MultipartFile file) {
        // 判斷檔案是否為空
        if (!file.isEmpty()) {
            try {
                CommonInfo cmmInfo = new CommonInfo();
                String separator = File.separator;
                String picPath2 = System.getProperty("user.dir").replace("b
                in","webapps")+ File.separator;
                String directory = picPath2 + "wyInFile" + separator+ cmmInfo.getDateStr() + separator;
                String newPicName = "";
                if (file.getSize() != 0) {
                String originalFileNameLeft = file.getOriginalFilename();
                    // 新的圖片名稱
                    newPicName = UUID.randomUUID()
                            + originalFileNameLeft
                                    .substring(originalFileNameLeft
                                            .lastIndexOf("."));
                    // 新圖片,寫入磁碟
                    File f = new File(directory, newPicName);
                    if (!f.exists()) {
                        // 先建立檔案所在的目錄
                        f.getParentFile().mkdirs();
                    }
                    file.transferTo(f);
                }
                return cmmInfo.getDateStr() + separator + newPicName;
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return "";
    }
/**
     * 工具類:上傳檔案:不改名字
     */
    public static String saveFile2(HttpServletRequest request,
            MultipartFile file) {
        // 判斷檔案是否為空
        if (!file.isEmpty()) {
            try {
                CommonInfo cmmInfo = new CommonInfo();
                String separator = File.separator;
                String picPath2 = System.getProperty("user.dir").replace("b
                in","webapps")+ File.separator;
                String directory = picPath2 + "wyInFile" + separator+ cmmInfo.getDateStr() + separator;
                String newPicName = "";
                if (file.getSize() != 0) {
                    String originalFileNameLeft = file.getOriginalFilename();
                    // 新的圖片名稱
                    int index = originalFileNameLeft.lastIndexOf(".");
                    newPicName = originalFileNameLeft.substring(0, index)
                            + cmmInfo.getTimeStr()
                            + originalFileNameLeft.substring(index);
                    // 新圖片,寫入磁碟
                    File f = new File(directory, newPicName);
                    if (!f.exists()) {
                        // 先建立檔案所在的目錄
                        f.getParentFile().mkdirs();
                    } else {
                        f.delete();
                    }
file.transferTo(f);
                }
                return cmmInfo.getDateStr() + separator + newPicName;
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return "";
    }

3.提交表單,檢視頁面顯示功能,伺服器內圖片儲存情況
提交後頁面顯示:
在這裡插入圖片描述
伺服器檔案儲存情況:
在這裡插入圖片描述
我們可以看到在tomcat下的WyInFile檔案下有一個以時間命名的資料夾。
在這裡插入圖片描述
點選進入後,發現我們剛才上傳的圖片就在其中,並且命名也已UUID進行修改,此時說明圖片上傳完成。
下來就是在jsp中的img src屬性中加入 圖片資料夾名/${jstl中圖片的屬性 例:item.img},就可將圖片從伺服器中訪問在JSP頁面中了。

結語

各位看到這裡,整個ajaxFileupload上傳和回顯功能就完成了,最後總結幾點博主開發時的問題,希望可以幫到大家:

  1. 回顯示時呼叫方法引數容易出錯,瀏覽器相容問題
  2. ajaxFileupload中引數的傳遞,data值
  3. java方法中的真實路徑和訪問路徑混淆
  4. 呼叫工具類處理方法後的返回值處理
  5. 最後img src中的路徑訪問
    謙卑若愚,好學若飢。此方法不止侷限於上傳頭像,還可以上傳檔案例如word和Excel表格,也可上傳多檔案,要在realpath處進行分隔符載入,以上問題都可以回覆博主進行討論,最後,我們不止會New!