网站建设开发中,SWFUpload 插件经验总结.

2011-12-12 00:00:00 by 【6yang】, 543 visits, 收藏 | 返回

官网:   http://www.swfupload.org/

大至设置介绍如下:

//![CDATA[
var swfu; //先定义swfu, 因为这个是对象,其它地主可以会用到.所有放在全局里使用了.
$(function(){
    swfu = new SWFUpload({
        // Backend settings
        upload_url: "/upload/documentget",
        // Flash file settings
        file_size_limit : "100 MB",
        file_types : "*.doc;*.docx;*.pdf;*.xls;*.xlsx;*.zip",            // or you could use something like: "*.doc;*.wpd;*.pdf",
        file_types_description : "DOC, DOCX, PDF, XLS, XSLX or ZIP File",
        file_upload_limit : "0",
        file_queue_limit : "1",
        // Event handler settings
        // swfupload_loaded_handler : swfUploadLoaded,
        file_dialog_start_handler: fileDialogStart,
        file_queued_handler : fileQueued,
        // file_queue_error_handler : fileQueueError,
        // file_dialog_complete_handler : fileDialogComplete,
        upload_start_handler : uploadStart,
        // upload_progress_handler : uploadProgress,
        upload_error_handler : uploadError,
        upload_success_handler : uploadSuccess,
        upload_complete_handler : uploadComplete,
        // Button Settings
        button_image_url : "/images/upload.png",
        button_placeholder_id : "btnBrowse",
        button_width: 132,
        button_height: 24,
        button_window_mode : SWFUpload.WINDOW_MODE.TRANSPARENT,  //注册这里的环节,Firefox下.会有bug.当你的flash透明时.弹出的文件选择窗口参数会被修改,如:当你再点击上传按钮.此窗口会被关闭,接下来会卡死你了.呵呵 .所以在做透明按钮里要全面考虑.
        // Flash Settings
        flash_url : "/swf/swfupload.swf",
        custom_settings : {
            progress_target : "fsUploadProgress",
            upload_successful : false
        },
        // Debug settings
        debug: false
    });

//]]>

文件调用成功后:ajax 处理.

upload_complete_handler : function(file) {
    if(file["filestatus"] == -4){ //这里很重要,当文件返回时,如出现i/o 或 404页面找不到情况要判断是否文件上传成功.
        arrFiles.push(file.name);
    }
    if (this.getStats().files_queued === 0) {
        document.getElementById(this.customSettings.cancelButtonId).disabled = true;
    }
},
queue_complete_handler : function(numFilesUploaded) {
    var status = document.getElementById("divStatus");
    status.innerHTML = numFilesUploaded + " file" + (numFilesUploaded === 1 ? "" : "s") + " uploaded.";
    var arrId = $("#dialogUploadFile").data("arrId"),
        folder = $("#dialogUploadFile").data("folder", folder),
        Url = "ajax.php",
        oData = {id: arrId, arrFiles: arrFiles, folder: folder};
    if(arrFiles.length == 0){
        return;
    }
    Utils.Server.XHR(oData, Url, function(json){
        if(json.status == "success"){
            Utils.Server.alertBox(json);
            $.pwrd.alertBox("Upload successuflly!");
            $("#dialogUploadFile").hide();
            $("#fsUploadProgress .progressWrapper").remove();                                   
            arrFiles = [];
        }
    });
}

 

再从安全角度出发:

说实话,swfupload这个上传组件是相当不错的
能上传大文件,带进度条,可以多文件上传等等。。。
可是在firefox中用它上传的时候就会有问题(当然这也不能怪swfupload,根本原因还是flash player身上)
什么问题呢?
"在非ie内核的浏览期里边swf不能发送cookie"
也就是说,比如你在firefox里面使用swfupload上传文件,如果上传的时候需要做登录验证(这个登录验证是基于cookie或者session),就会出问题。
至于你遇没遇到,反正我是遇到了。
我的解决办法就是:

post_params : {
   
"swfAuthId" : ´<?php echo $sessionId;?>´,
   
"authKey" : ´<?php echo $authKey;?>´
},
swfupload在上传文件的时候再传递两个参数,这两个参数是怎么来的呢?
<?php
$sessionId
= session_id().time();
$systemKey
= ´asdfasdfasdfasdfasdfs´;  //这个是随即生成的一个字符串,不会变
$authKey
= md5($systemKey.$sessionId);
?>
然后在上传文件的时候判断
<?php
if($_POSTauthKey´] !== md5($systemKey.$_POSTswfAuthId´]){
   
dieerror!´);
}
?>
分享到:
share

    图片原图

    loading

    loading