1. 程式人生 > >jquery-uploadify3.2使用心得

jquery-uploadify3.2使用心得

 

最近做檔案上傳,使用了jquery-uploadify外掛,用的是官網最新的3.2版本,官網地址:http://www.uploadify.com/download/

在這裡建議下:在面對最新的版本的時候,最好是去它的官網檢視文件,同時借鑑下別人寫的舊版本的使用心得,這樣就能快速的上手了,好了,言歸正傳,let's go

解壓下載的檔案到任意一個目錄下面,資料夾名稱為uploadify,最好是自己重新命名一下,在後面加上版本號;檔案內容如下

官方給的是php的示例,這裡我用的java所以就不看了,直接刪了只留下以下檔案:

接下來就是如何使用了,首先,在頁面加入引用,主要是三個檔案,一個是jquery必不可少的,另外兩個就是外掛資料夾下面的了,這個外掛資料夾可以拷貝到自己的專案路徑下,如我的就是在專案根目錄下的js檔案裡面,同時要在根目錄下面建立一個img資料夾,將上圖中的uploadify-cancel.png圖片放進去,這樣子可以解決外掛取消檔案佇列報錯找不到圖片的錯誤

<script type="text/javascript" src="js/jquery-1.8.3.js"></script>
<link rel="stylesheet" type="text/css" href="./js/uploadify/uploadify.css">
<script type="text/javascript" src="./js/uploadify/jquery.uploadify.js"></script>

 

 這裡圖片路徑一定要是對的,還有一個要注意的問題就是jquery衝突 問題,在很多時候做頁面的時候,我們都是喜歡引入頭部,底部兩個頁面,問題就在這裡,如果你的主頁面也就是需要用到外掛的頁面引入了這兩個頁面的話,必須保證這兩個頁面中沒有引入多餘的jquery.js檔案,不然就會導致出現$(..).uploadify not a function 的錯誤

。切記,這是我親自嘗過的苦啊。

 

接下來就是渲染上傳按鈕的操作了,程式碼如下:

頁面HTML

<tr>
    <td class="align_right">
            <em><font color="red">*</font></em>
            <label>上傳寫真照</label>
    </td>
    <td class="input_style">
    <div class="upload_div"
> <input id="upload_photo" class="upload_button" type="button" value="本地上傳"/> <input type="hidden" id="userPhoto" name="userPhoto"/> <div id="photo_queue"></div> <p>最多上傳10張照片,尺寸480*800,格式jpg或png可批量上傳</p> </div> </td> </tr>

JS檔案

$("#upload_photo").uploadify({
        //按鈕額外自己新增點的樣式類.upload
        'buttonClass'        :    'upload',
        //限制檔案上傳大小
        'fileSizeLimit'        :    '2MB',
        //檔案選擇框顯示
        'fileTypeDesc'        :     '選擇圖片',
        //檔案型別過濾
        'fileTypeExts'         :     '*.jpg;*.png',
        //按鈕高度
        'height'            :    '30',
        //按鈕寬度
        'width'                :    '100',
        //請求型別
        'method'            :    'post',
        //是否支援多檔案上傳
        'multi'                :     true,
        //需要重寫的事件
        'overrideEvents'    :    ['onDialogClose','onSelectError','onUploadError'],
        //佇列ID,用來顯示檔案上傳佇列與進度
        'queueID'            :    'photo_queue',
        //佇列一次最多允許的檔案數,也就是一次最多進入上傳佇列的檔案數
        'queueSizeLimit'    :    10,
        //上傳動畫,外掛檔案下的swf檔案
        'swf'                :    './js/uploadify/uploadify.swf',
        //處理上傳檔案的服務類
        'uploader'            :    '/UploadFileServlet?type=photo&uploadPath=' + userId + '\\' + appId,
        //上傳檔案個數限制
        'uploadLimit'        :   10,
        //上傳按鈕內容顯示文字
        'buttonText'        :    '圖片上傳',
        //自定義重寫的方法,檔案上傳錯誤觸發
        'onUploadError'        :    uploadify_onUploadError,
        //檔案選擇錯誤觸發
        'onSelectError'        :    uploadify_onSelectError,
        //檔案佇列上傳完畢觸發
        'onQueueComplete'    :    heightReset,
        //佇列開始上傳觸發
        'onUploadStart'        :   heightFit,
        //單個檔案上傳成功觸發
        'onUploadSuccess'    :    function(file, data, response){
            $("#userPhoto").attr("value",data);
            //恢復原始高度
        }
    });

這裡有個小問題就是:'queueSizeLimit' 和 'uploadLimit'這兩個引數配置的效果是一樣的,而且哪個配置的小,就是按照哪個來的,也就是說想通過外掛來實現限制上傳檔案個數是不現實的,這個必須結合後臺程式才能限制總的檔案上傳個數。可以在'onUploadStart'中通過ajax請求後臺程式,返回檔案個數,然後在做相應的處理

 

 

後臺處理檔案上傳服務類:

public Map<String, String> uploadPackage(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
        //使用apache開源組織下的commons-fileupload-1.2.jar元件做檔案上傳
        String projectPath = PathTool.getWebRootPath();
        String tempPath = projectPath + "uploadFile/temp";
        Map<String, String> params = new HashMap<String, String>();
        try
        {
            DiskFileItemFactory factory = new DiskFileItemFactory();
            //設定檔案緩衝區大小
            factory.setSizeThreshold(1024 * 1024);
            //超過緩衝區大小,臨時檔案放在什麼地方
            factory.setRepository(new File(tempPath));
            
            //2、使用檔案上傳工廠,建立一個檔案上傳的servlet物件;解析表單,儲存到list裡面
            ServletFileUpload upload = new ServletFileUpload(factory);
            //允許上傳的大小,以位元組為單位
            upload.setFileSizeMax(1024 * 1024 * 1024);
            //設定編碼格式
            upload.setHeaderEncoding("UTF-8");
            // 得到所有的表單域,它們目前都被當作FileItem
            List<FileItem> items = upload.parseRequest(request);
            Iterator<FileItem> iter = items.iterator();
            // 依次處理請求
            while (iter.hasNext())
            {
                FileItem item = iter.next();
                if (item.isFormField())
                {    // 如果是普通的表單域
                    /* "處理普通表單內容 ... */
                    String name = item.getFieldName();
                    String value = new String(item.getString().getBytes("ISO-8859-1"), "utf-8");
                    params.put(name, value);
                }
                else
                { /* 如果是檔案上傳表單域 */
                    // 1.獲取檔名
                    String fileName = item.getName();
                    String fieldName = item.getFieldName();    //檔案域名稱
                    String contentType = item.getContentType();    //檔案型別
                    if (fileName != null & !"".equals(fileName))
                    {    
                        System.out.println("檔案域名稱:" + fieldName + "\n檔名:" + fileName + "\n檔案型別:" + contentType);
                        //獲取檔案字尾名
                        String suffix = fileName.substring(fileName.lastIndexOf(".")+1);
                        // 2.先將上傳檔案儲存到本地硬碟上
                        ServletContext context = this.getServletContext();
                        String dir = "";
                        //=======將上傳的檔案存放到伺服器的專門的資料夾下:uploadfile============
                        Date date = new Date();
                        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddhhmmss");
                        fileName = sdf.format(date) + fileName;
                        //這裡判斷檔案型別
                        //以應用id做為資料夾分類
                        if("png".equals(suffix) || "jpg".equals(suffix)){
                            dir = context.getRealPath("uploadFile/photo/");
                        }
                        if("mp3".equals(suffix)){
                            dir = context.getRealPath("uploadFile/music/");
                        }
                        dir += appId;
                        System.out.println(dir);
                        File file = new File(dir,fileName);
                        //當且僅當不存在具有此抽象路徑名指定名稱的檔案時,不可分地建立一個新的空檔案
                        file.createNewFile();
                        // 獲得流,讀取資料寫入檔案  
                        InputStream in = item.getInputStream();  
                        FileOutputStream fos = new FileOutputStream(file);  
                        int len = 0;
                        byte[] buffer = new byte[1024];
                        // 3.獲取本地檔案的絕對路徑
                        while ((len = in.read(buffer)) > 0){
                            fos.write(buffer, 0, len); 
                        }  
                        // 關閉資原始檔操作  
                        fos.close();  
                        in.close();  
                        // 刪除臨時檔案  
                        item.delete();  
                        //new FtpUploadThread(filepath, "handbb_down", fileName).run();
                        //這裡判斷是圖片還是mp3檔案
                        if("png".equals(suffix) || "jpg".equals(suffix)){
                            photo += fileName + ",";
                        }
                        
                        if("mp3".equals(suffix)){
                            music += fileName + ",";
                        }
                        // 7.刪除本地檔案
                        //file.delete();
                    }
                    else
                    {// 修改操作時,如果沒有上傳檔案
//                        if("icon_url".equalsIgnoreCase(fieldName)){
//                        }
//                        if("download_url".equalsIgnoreCase(fieldName)){
//                        }
                    }
                }
            }
            params.put("photo", photo);
            params.put("music", music);
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        return params;
    }

好了,基本的使用方法就到這裡了