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;
    }

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

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM