Uploadify上傳文件方法

字號:


    Uploadify是JQuery的一個上傳插件,實現(xiàn)的效果非常不錯,帶進度顯示。不過官方提供的實例時php版本的,本文將詳細介紹Uploadify在Aspnet中的使用,您也可以點擊下面的鏈接進行演示或下載。
    先給大家展示下效果圖:
    名單
    修改:
    報找不到uploadify-cancel.png文件。找到uploadify.css,找到.uploadify-queue-item .cancel a {,修改文件的路徑。
    好多人都說,在chrome、Firefox上使用uploadify的時候獲取不到session導(dǎo)致上傳出錯。需要手工將session id方法附加參數(shù)中。但是我這里并沒有這么做,并且在chrome、Firefox上傳沒問題,不知道為什么,也許是因為我用的最新版的原因吧。
    要點:
    uploadify的js配置已經(jīng)比較全面,在實際使用的時候可以適當(dāng)?shù)膭h減一些方法和屬性。
    一般情況下的單文件上傳只考慮onSelect、onUploadError和onUploadSuccess即可。
    如果是多文件上傳,那么在單文件上傳的基礎(chǔ)上再加上對整個隊列的監(jiān)聽onQueueComplete。
    開始上傳所有文件:$('#file_upload').uploadify('upload', '*');
    取消上傳:$('#file_upload').uploadify('cancel', parm);
    parm為空:取消上傳第一個文件。
    parm為'*':取消所有的上傳文件。
    parm為file id:取消該file id對應(yīng)的文件。
    修改附加的一些變量:$('#file_upload').uploadify("settings","formData",{"name1":"中文name","parm1":"修改后的參數(shù)"});參數(shù)為json,如果該json中的某個變量已經(jīng)有了,那么覆蓋該屬性,如果沒有,那么追加該屬性。
    服務(wù)端設(shè)置編碼為:upload.setHeaderEncoding("UTF-8");,這樣解析的文件名稱為正常中文。但是解析的附加變量中文亂碼,這里做一次轉(zhuǎn)碼(總感覺轉(zhuǎn)碼比較low,不知道是哪里配置的不對)。new String(item.getString().getBytes("iso8859-1"),"utf-8")
    服務(wù)端最后返回文件保存路徑(這里可以隨便定義返回內(nèi)容)。
    步驟:
    配置uploadify
    <%@ page language="java" contentType="text/html;charset=UTF-8" pageEncoding="UTF-8"%>
    <%String path = request.getContextPath();%>
    <%String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%>
    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <base href="<%=basePath %>">
    <title></title>
    <link rel="stylesheet" type="text/css" href="jquery-easyui-1.4.3/themes/default/easyui.css">
    <link rel="stylesheet" type="text/css" href="jquery-easyui-1.4.3/themes/icon.css">
    <script type="text/javascript" src="jquery-easyui-1.4.3/jquery.min.js"></script>
    <script type="text/javascript" src="jquery-easyui-1.4.3/jquery.easyui.min.js"></script>
    <script type="text/javascript" src="uploadify/uploadify/jquery.uploadify.min.js"></script>
    <link rel="stylesheet" type="text/css" href="uploadify/uploadify/uploadify.css" />
    </head>
    <script>
    $(function(){
    $(function() {
    $(function() {
    $('#file_upload').uploadify({
    'uploader' : '<%=basePath%>/UploadServlet',//服務(wù)端地址
    'swf' : 'uploadify/uploadify/uploadify.swf',
    'buttonImage' : 'uploadify/uploadify/img/chooseFile.jpg',//重載按鈕圖片
    'buttonClass' : 'some-class',//重載按鈕樣式
    'height':19,//按鈕寬度和高度
    'width':76,
    'queueID' : 'file_queue',//顯示文件隊列的一個div,在頁面定義
    'formData' : {'parm1':'參數(shù)1','year':'2016'},//附加參數(shù),可以在upload參數(shù)中更改
    'buttonText':'選擇文件',//按鈕顯示文字,如果有圖片的話,會被圖片擋住
    'fileSizeLimit':'1MB',//文件最大
    'auto':false,//自動提交
    'fileTypeExts' : '*.gif; *.jpg; *.png',//文件類型
    'fileTypeDesc' : '只能上傳圖片',//選擇文件的時候的提示信息
    'multi' : true,//多選
    'queueSizeLimit' : 3,//隊列中文件的個數(shù)
    'onSelect' : function(file) {
    console.log(file);
    alert("選擇文件:" + file.name + "\n類型="+file.type+"\n大小="+file.size);
    if(file.size>1024000){//文件太大,取消上傳該文件
    alert("文件大小超過限制!");
    $('#file_upload').uploadify('cancel',file.id);
    }
    },
    'onUploadSuccess' : function(file, data, response) {
    alert('每個文件上傳成功后觸發(fā) ' + file.name + ' was successfully uploaded with a response of ' + response + ':' + data);
    },
    'onUploadComplete' : function(file) {
    alert('每個文件上傳完成,無論對錯都觸發(fā)! ' + file.name + ' finished processing.');
    },
    'onUploadError' : function(file, errorCode, errorMsg, errorString) {
    alert('上傳出錯 ' + file.name + ' could not be uploaded: ' + errorString);
    },
    'onQueueComplete':function(queueData){
    alert("隊列中的所有文件上傳完成后觸發(fā)。\n"+queueData.uploadsSuccessful+'\n'+queueData.uploadsErrored)
    },
    });
    });
    });
    });
    function upload(){
    $('#file_upload').uploadify("settings","formData",{"name1":"中文name","parm1":"修改后的參數(shù)"});
    $('#file_upload').uploadify('upload', '*');//上傳所有文件
    }
    function cancel(){
    $('#file_upload').uploadify('cancel', '*');//取消所有文件
    }
    function destroy(){
    alert("取消upload上傳,變成原來樣式!");
    $('#file_upload').uploadify('destroy');//destory
    }
    </script>
    <body>
    <div>
    </div>
    <div>
    <a href="javascript:void(0)" onclick="upload()">開始上傳</a>
    <a href="javascript:void(0)" onclick="cancel()">取消上傳</a>
    <a href="javascript:void(0)" onclick="destroy()">destroy</a>
    <input type="file" name="file_upload" id="file_upload" />
    <div id="file_queue"></div>
    </div>
    </body>
    </html>
    服務(wù)端
    package com.servlet;
    import java.io.File;
    import java.io.IOException;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    import java.util.Iterator;
    import java.util.List;
    import java.util.UUID;
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import org.apache.commons.fileupload.FileItem;
    import org.apache.commons.fileupload.FileUploadException;
    import org.apache.commons.fileupload.disk.DiskFileItemFactory;
    import org.apache.commons.fileupload.servlet.ServletFileUpload;
    /**
    * Servlet implementation class UploadServlet
    */
    @WebServlet(name="UploadServlet",urlPatterns="/UploadServlet")
    public class UploadServlet extends HttpServlet {
    private static final long serialVersionUID = -6483558339095298703L;
    /**
    * @see HttpServlet#HttpServlet()
    */
    public UploadServlet() {
    super();
    // TODO Auto-generated constructor stub
    }
    /**
    * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
    */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // TODO Auto-generated method stub
    response.getWriter().append("Served at: ").append(request.getContextPath());
    }
    /**
    * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
    */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    System.out.println("獲取session,可以根據(jù)這個session進行一些其他的判斷" + request.getSession().getId());
    SimpleDateFormat sdf=new SimpleDateFormat("yyyyMMdd");
    String remotePath = File.separator + "download" + File.separator + sdf.format(new Date()) + File.separator;
    String savePath = remotePath;
    File dfile = new File(savePath);
    if (!dfile.exists()) {
    dfile.mkdirs();
    }
    DiskFileItemFactory fac = new DiskFileItemFactory();
    ServletFileUpload upload = new ServletFileUpload(fac);
    upload.setHeaderEncoding("UTF-8");
    List<FileItem> fileList = null;
    try {
    fileList = upload.parseRequest(request);
    } catch (FileUploadException ex) {
    return;
    }
    Iterator<FileItem> it = fileList.iterator();
    String name = "";
    String extName = "";
    while (it.hasNext()) {
    FileItem item = it.next();
    if (!item.isFormField()) {
    name = item.getName();
    long size = item.getSize();
    String type = item.getContentType();
    System.out.println("文件=" + name + " " + size + " " + type);
    if (name == null || name.trim().equals("")) {
    continue;
    }
    // 擴展名格式:
    if (name.lastIndexOf(".") >= 0) {
    extName = name.substring(name.lastIndexOf("."));
    }
    File file = null;
    do {
    // 生成文件名:
    name = UUID.randomUUID().toString();
    file = new File(savePath + name + extName);
    } while (file.exists());
    File saveFile = new File(savePath + name + extName);
    try {
    item.write(saveFile);
    } catch (Exception e) {
    e.printStackTrace();
    }
    }else if(item.isFormField()){
    System.out.println("表單內(nèi)容:" + item.getFieldName() + "=" + new String(item.getString().getBytes("iso8859-1"),"utf-8"));
    }
    }
    String requestPath = remotePath + name + extName;
    request.getSession().setAttribute(requestPath, requestPath);
    response.getWriter().write(savePath + name + extName);
    }
    }