`
tmuffamd
  • 浏览: 28409 次
  • 性别: Icon_minigender_2
  • 来自: 重庆
社区版块
存档分类
最新评论

SWFUpload 批量上传图片

 
阅读更多

    SWFUpload是一个客户端文件上传工具,最初由Vinterwebb.se开发,它通过整合Flash与JavaScript技术为WEB开发者提供了一个具有丰富功能继而超越传统<input type="file" />标签的文件上传模式。
其官方网站:
http://swfupload.org/

SWFUpload的主要特点
* 可以同时上传多个文件;
* 类似AJAX的无刷新上传;
* 可以显示上传进度;
* 良好的浏览器兼容性;
* 兼容其他JavaScript库 (例如:jQuery, Prototype等);
* 支持Flash 8和Flash 9;
SWFUpload不同于其他基于Flash构建的上传工具,它有着优雅的代码设计,开发者可以利用XHTML、CSS和JavaScript来随心所欲的定制它在浏览器下的外观;它还提供了一组简明的JavaScript事件,借助它们开发者可以方便的在文件上传过程中更新页面内容来营造各种动态效果。
我们来看看基本的实例:
一、前端文件:upload_batch.tpl(模板引擎:smarty)
<link type="text/css" href="swfupload/default.css" rel="stylesheet" />
<script type="text/javascript" src="swfupload/swfupload.js"></script>
<script type="text/javascript" src="swfupload/swfupload.queue.js"></script>
<script type="text/javascript" src="swfupload/fileprogress.js"></script>
<script type="text/javascript" src="swfupload/handlers.js"></script>
<script type="text/javascript">
window.onbeforeunload = function()   //离开时弹出提醒对话框 当上传成功后自动跳转时,不进行提示,由自定义变量level值控制
{
    var level = document.getElementById("level").value;
    if(level == 1) {
        return '';
    }
}
</script>

<div id="content01" style="position:relative;">
    <form id="form1" name="form1" action="index.php" method="post" enctype="multipart/form-data" >
        <span class="right" id="choose_album" style="display:;">
        请选择所属相册:
        <select name="picgid" id="picgid" class="border var_h6" onchange="setPost();">
        {section name=loop loop=$albumrs}
        <option value="{$albumrs[loop].id}" {if $albumrs[loop].id == $aid}selected{/if}>{$albumrs[loop].name}</option>
        {/section}
        </select>  &nbsp;&nbsp;或者<a onclick="javascript:c_al_js()" style="cursor:pointer;">创建新相册</a></span>
        <div id="overlay"style="position:absolute; top:0; left:0; background:#fff; width:120px; height:35px; display:none;"></div>
        <span id="spanButtonPlaceHolder"></span>        
        <div class="flash clearfix">
            <div class="up_detail">请先点击"添加照片"按钮,选择要上传的照片</div>
            <div class="fieldset"  id="fsUploadProgress">
            </div>
        </div>
        <div id="divMovieContainer">
            <a onclick="swfu.startUpload();" class="upload_disbutton" id="upload">开始上传</a>
        </div>
        <div>
        </div>
        <input type="hidden" id="level" value="2">
        <input type="hidden" name="uid" value="{$userid}" id="uid">
    </form>
</div>

<script type="text/javascript">
       var swfu;
       var settings = {
                flash_url : "swfupload/swfupload.swf",  //上传的Flash
                upload_url: "http://www.domain.com/upload_batch.php", //处理上传请求的服务器端脚本URL
                post_params: {"PHPSESSID" : "<?php echo session_id(); ?>"}, //开辟了一个新的Session进程
                file_size_limit : "5 MB",  //上传文件体积上限,单位MB
                file_types : "*.jpg;*.gif;*.png;*.jpeg", //允许上传的文件类型 用 ; 号分割
                file_types_description : "All Files",  //文件类型描述
                file_upload_limit : 100, //限定用户一次性最多上传多少个文件,在上传过程中,该数字会累加。0 则表示没有限制
                file_queue_limit : 20, //上传队列数量限制
                debug: false,  //是否显示调试信息,上线后记得将此关闭

       
                //添加照片的按钮设置
                button_image_url: "swfupload/button.png", //按钮的图片
                button_width: "110",
                button_height: "30",
                button_placeholder_id: "spanButtonPlaceHolder",
                button_text: '',
                button_text_style: ".add_button {display:block;  float:left; background:#000000; font-size:13px; font-weight:bold; padding-left:30px; width:66px; height:30px; line-height:30px; color:#000; cursor:pointer; text-decoration:none; margin-left:5px; cursor:pointer; }",
                button_text_left_padding: 12,
                button_text_top_padding: 3,
                button_window_mode: SWFUpload.WINDOW_MODE.TRANSPARENT,
                button_cursor: SWFUpload.CURSOR.HAND,     //鼠标手型
               
                //这些事件处理函数定义在:handlers.js 文件中
                file_queued_handler : fileQueued,   //文件成功选择后触发的事件处理函数

                file_dialog_start_handler: fileDialogStart,
                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 //文件上传完成后触发的事件处理函数
            };

        //初始化和设置
        function initSWF() {
            swfu = new SWFUpload(settings);
        }
        function setPost()  //动态传递参数
        {
            var aid = document.getElementById('picgid').value; //相册ID
            var uid = document.getElementById('uid').value;    //上传照片用户ID
            swfu.addPostParam("gid", gid);
            swfu.addPostParam("uid", uid);//动态修改SWFUpload初始化设置中的post_params属性,其中所有的值都将被覆盖。
        }
        initSWF(); //初始化
    </script>

二、页面效果图

upload
当选择好多个文件后,点击开始上传,上传文件的过程中,每一次都会去执行后端的保存文件。
三、后端文件是PHP程序:upload_batch.php
<?php
    // Work-around for setting up a session because Flash Player doesn't send the cookies
    if (isset($_POST["PHPSESSID"])) {
        session_id($_POST["PHPSESSID"]);
    }
    session_start();
   
    if (!isset($_FILES["Filedata"]) || !is_uploaded_file($_FILES["Filedata"]["tmp_name"]) || $_FILES["Filedata"]["error"] != 0) {
        echo "There was a problem with the upload";
    }
    $gid = empty($_POST['aid']) ? '0' : $_POST['aid'];
    $uid = $_POST['uid'];
   
    //判断目录是否存在
    $user_path = 'user/'.substr($uid,-3).'/'.$uid;
    if(!file_exists('/home/www/hoopchina/image/'.$user_path)) {
        if(!file_exists('../image/user/'.substr($uid,-3))) {
            mkdir('../image/user/'.substr($uid,-3),0777);
        }
        if(!file_exists('../image/'.$user_path)) {
            mkdir('../image/'.$user_path,0777);
        }
    }

    //上传保存的路径
    //$save_path = "../images/";
    $save_path = '../image/'.$user_path;
    //上传文件赋值给$upload_file
    $upload_file = $_FILES['Filedata'];
    //获取文件类型
    $file_info = pathinfo($upload_file['name']);
    //获取文件扩展名
    $file_ext = strtolower($file_info['extension']);
    if ($file_ext == 'jpeg') { //类型转换
        $file_ext = 'jpg';
    }
   
    if (!isset($upload_file)) {
        handleError("未找到上传文件" . $upload_file['name']);
        exit(0);
    } else if (!isset($upload_file['name'])) {
        handleError("文件未命名");
        exit(0);
    }
    $upload_file['filename'] = time().'.'.$file_ext;
    $upload_file['filenamebig'] = time().'big.'.$file_ext; 
    $upload_file['filenamesmall'] = time().'small.'.$file_ext;
    if (!@move_uploaded_file($upload_file["tmp_name"], $save_path.'/'.$upload_file['filenamebig'])) {
        handleError("文件上传失败");
        exit(0);
    } else {
        //切割图片cut_photo($x,$y,$oldpic,$newpic)
        cut_photo(130,180,$save_path.'/'.$upload_file['filenamebig'], $save_path.'/'.$upload_file['filenamesmall']);
        if($file_ext == 'gif') { //是否为GIF动画
            $fp = fopen($save_path.'/'.$upload_file['filenamebig'], 'rb');
            $filecontent = fread($fp, filesize($save_path.'/'.$upload_file['filenamebig']));
            fclose($fp);
            strpos($filecontent,chr(0x21).chr(0xff).chr(0x0b).'NETSCAPE2.0') === FALSE ? $isgif = 0 : $isgif = 1;
            if ($isgif) { //如果是多帧的,刚不用切割,直接copy
                copy($save_path.'/'.$upload_file['filenamebig'],$save_path.'/'.$upload_file['filename']);
            } else {
                cut_photo(750,1500,$save_path.'/'.$upload_file['filenamebig'], $save_path.'/'.$upload_file['filename']);
            }
        } else {
            cut_photo(750,1500,$save_path.'/'.$upload_file['filenamebig'], $save_path.'/'.$upload_file['filename']);
        }
        //将图片被切割为(750,1500)大小的路径写入数据库 
        $db_path = $user_path.'/'.$upload_file['filename'];
        //计算图片大小,单位:KB   
        $file_size = ceil($upload_file['size']/1024);
        //写入数据库
        $db->query("INSERT INTO photo (pid, aid, uid, name, pic, dateline, size, hits) VALUES (NULL, '{$aid}', '{$uid}' , '".iconv('utf-8','gbk', $upload_file['name'])."', '{$db_path}', '".time()."', '{$file_size}', '0')"); //iconv是为了上传中文文件名乱码的问题
    }
    exit(0);
   
function handleError($message) {
    echo $message;
}
?>

以上只是个人在项目中用到的基本方法,只是部分代码。如有不对处,欢迎大家拍砖。希望对有需要的筒子起个抛砖引玉的效果。

 

注: 在使用过会偶尔弹出“uncaught exception: call to SetPostParams failed ” 错误,经分析应该swfu还未完全加载,后将这个函数的调用放入handlers.js中fileDialogStart()函数中:

function fileDialogStart()
{
    setPost();
}

再测试,一切正常。

分享到:
评论
1 楼 bluewjzhhr 2012-05-01  
挺不错的,能否打包一份呀???

相关推荐

    SWFUpload批量上传图片

    这个"SWFUpload批量上传图片"的项目是一个基于MyEclipse的工程实例,旨在帮助开发者理解和实现批量上传图片的功能。下面我们将深入探讨SWFUpload的工作原理、主要特性以及如何在MyEclipse环境中进行集成和应用。 一...

    swfupload批量上传图片

    SWFUpload是一款强大的JavaScript与Flash结合的文件上传组件,它允许用户在网页上实现批量上传图片的功能。在本文中,我们将深入探讨SWFUpload的工作原理、实现步骤以及如何在上传成功后显示缩略图,并对图片进行...

    SWFUpload 批量上传 图片

    批量上传图片的功能是现代网站尤其是社交媒体和图像分享平台不可或缺的特性。SWFUpload 提供了这样的功能,允许用户选择多个文件并一次性提交,极大地提高了用户交互性。其工作原理是利用Flash插件在后台处理上传...

    SwfUpload批量上传图片,在上传之前进行图片压缩,上传完成之后显示图片。修改了flash,和58和微博上传类似,压缩后图片100K左右。

    这个项目用的是SwfUpload批量上传,这个第三方库在上传之前并没有进行图片压缩和上传后图片显示功能,本人改写了flash,实现了图片上传前首先压缩图片,2M的图片压缩后100K到200K,上传后进行图片显示。采用的是java...

    asp.net利用swfupload批量上传.zip

    ASP.NET结合SWFUpload实现批量上传功能是一种常见的网页文件上传技术。SWFUpload是一个JavaScript库,它使用Flash技术提供了一种优雅的方式来进行大文件的多文件上传,特别适合那些需要处理大量图片或文档的Web应用...

    Asp.Net+flash批量上传图片+预览(此版带版权)

    总之,这个资源包结合了Asp.Net、Flash和SWFUpload,提供了一种批量上传图片并预览的功能实现,但请注意版权问题,仅适用于个人学习和研究。在实际开发中,可能需要寻找无版权限制的解决方案,或者使用HTML5原生的多...

    SWFUpload 批量上传(一次选取) 保存到数据库

    SWFUpload 是一款开源的JavaScript库,主要用于在网页上实现文件的批量上传功能。它支持一次选取多个文件,用户可以在不刷新页面的情况下上传文件,提高了用户体验。本教程将详细介绍如何利用SWFUpload实现批量上传...

    SwfUpload(文件批量上传,完美运行,注释丰富)

    SwfUpload 是一款开源的JavaScript库,用于实现文件的批量上传功能。它通过Flash插件在Web页面上提供用户友好的界面,允许用户选择多个文件并一次性上传,极大地提升了文件上传的效率。在这个项目中,"完美运行"指的...

    swfupload图片上传插件制作图片批量上传和单个图片上传代码

    批量上传功能的实现主要依赖于SWFUpload的`setFilePostName`和`addFileParam`方法。`setFilePostName`用于设置上传文件在服务器端接收时的文件名,而`addFileParam`则可以在每个文件上传时添加额外的参数,如图片的...

    swfupload+asp+access批量上传图片

    "swfupload+asp+access批量上传图片" 这个标题涉及到三个主要的技术元素。首先,"swfupload" 是一个开源的Flash上传组件,它允许用户在网页上实现文件的批量上传功能,尤其适用于处理大文件或多个文件的上传需求。...

    swfupload 批量上传最大1.9G

    `swfupload` 是一个广泛使用的JavaScript和Flash相结合的开源上传组件,它允许用户实现多文件选择和批量上传功能,同时也支持大文件的分块上传。在这个场景下,我们主要关注的是如何利用`swfupload`实现最大1.9GB的...

    php + swfupload 实现批量上传图片实例

    总的来说,"php + swfupload 实现批量上传图片实例"是一个实用的解决方案,它利用PHP的文件处理能力和SWFUpload的多文件上传功能,为用户提供了一个易于使用的批量图片上传工具。只要配置正确,这个系统可以在各种...

    SWFUpload 批量上传插件

    1. 批量上传:SWFUpload 支持一次选择并上传多个文件,极大地提高了用户上传效率。 2. 预览功能:用户在上传前可以预览选定的文件,确保上传的是正确的内容。 3. 文件类型过滤:开发者可以通过配置限制可上传的文件...

    jquery swfupload图片上传插件制作图片批量上传和单...

    在IT行业中,jQuery Swfupload是一款非常流行的图片上传插件,尤其适用于实现批量上传和单个文件上传功能。这个插件结合了jQuery的简洁API和SWFUpload的技术优势,为网页应用提供了强大的文件上传解决方案。下面我们...

    java swfupload,上传,图片上传,文件上传,批量上传

    Java中的SWFUpload是一种流行的文件上传工具,尤其适用于处理图片和文件的批量上传。这个工具在Web开发中被广泛使用,因为它提供了用户友好的界面和高效的数据传输能力。SWFUpload是一个基于Flash的组件,它允许用户...

    swfupload批量图片上传

    SwfUpload是一款经典的JavaScript库,专门用于实现网页上的文件,特别是图片的批量上传功能。它通过Flash技术提供了一种在不刷新页面的情况下上传多张图片的解决方案,这在用户体验上有着显著的优势,因为它允许用户...

    swfupload批量上传组件

    SWFUpload最初是由Vinterwebb.se开发的一个客户端的上传工具. 它结合了FLASH和JavaScript的功能,以提供一种超越了传统的浏览器中标签...SWFUpload提供API供开发者通过图片、文字、CSS的方式来自定制更灵活的UI显示。

    swfupload + ASP批量上传图片可同步写入Access

    总结来说,"swfupload + ASP批量上传图片可同步写入Access"是一个基于SWFUpload和ASP技术的文件上传解决方案,它利用Flash实现多文件批量上传,并将图片信息同步写入Access数据库,同时实现在页面上的即时显示。...

    ecshop+swfupload实现批量上传图片

    在本文中,我们将深入探讨如何使用ECSHOP与SWFUpload相结合来实现在网站上批量上传图片的功能。ECSHOP是一款流行的开源电子商务系统,而SWFUpload则是一个JavaScript和Flash混合的文件上传组件,它支持多文件选择和...

Global site tag (gtag.js) - Google Analytics