songah 发表于 2010-6-27 17:37:58

致所有想要使用swfupload的人们

使用swfupload纯粹是因为它可以选择过滤不必要的文件格式,于是尝试了一下,于是写了一个swfupload最简单的代码,使用标准的ci文档中的upload_form.php,增加了一些js代码。swfupload路径在根目录中的js/swfupload中,注意file_post_name 需要和后台do_upload的参数一致:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />
<script src="<?=base_url().'js/swfupload/swfupload.js'?>" type="text/javascript"></script>
<title>Upload Form</title>
</head>
<script type="text/javascript">
    var swfu;

    window.onload = function() {
      var settings = {
            flash_url : "<?=base_url().'js/swfupload/swfupload.swf'?>",
            upload_url: "<?=site_url('upload/do_upload')?>",
            file_size_limit : "100 MB",
            file_types : "*.jpg;*.png;*.gif",
            file_types_description : "图片文件",
            file_post_name : 'upload',
            prevent_swf_caching : false,
            file_upload_limit : 100,
            file_queue_limit : 1,
            debug: true,

            // Button settings
            button_image_url: "<?=base_url().'js/swfupload/XPButtonUploadText.png'?>",
            button_width: "64",
            button_height: "29",
            button_placeholder_id: "upload",
            button_text: '<span class="theFont">上传</span>',
            button_text_style: ".theFont { font-size: 16; }",
            button_text_left_padding: 12,
            button_text_top_padding: 3,
            
            // The event handler functions are defined in handlers.js
            //file_queued_handler : function(){
            //file_queue_error_handler : fileQueueError,
            //file_dialog_complete_handler : fileDialogComplete,
            //upload_start_handler : function(){
            //upload_progress_handler : function(){alert('strat');},
            file_dialog_complete_handler : function(){this.startUpload();},
            //upload_error_handler : function(){alert('error');},
            upload_success_handler : function(file,serverData){alert(serverData);},
            //upload_complete_handler : uploadComplete,
            //queue_complete_handler : queueComplete        // Queue plugin event
      };

      swfu = new SWFUpload(settings);
   };
function upload()
{
    swfu.startUpload();
    return true;
}
</script>
<body>

<?php echo $error;?>

<?php echo form_open_multipart('upload/do_upload');?>

<input type="file" name="upload" id='upload' size="20" />

<br /><br />

<input type="submit" value="upload" />

</form>

</body>
</html>
然后结果让我非常郁闷,总是提示错误——不允许上传格式,然后仔细对比了正常上传和swfupload上传的差异,终于发现,swfupload上传$_FILES数组中的type居然是application/octet-stream,而在正常上传则是jgp-x之类的。
这个问题虽然小,但是却浪费了我不少时间,在此希望能够对其他人有所帮助。
stblog也使用了swfupload,应该已经解决了此问题。CI英文论坛也有解释解决方法http://codeigniter.com/forums/viewthread/70979/——虽然是英文的,但是应该没有问题吧

Hex 发表于 2010-6-27 20:36:06

呵呵,经过 flash 上传的都没有 mime 类型。
只能通过扩展名来验证文件了,呵呵。

spt119 发表于 2010-6-27 21:30:36

swfupload是个非常不错的大文件上传解决方案。

songah 发表于 2010-6-28 09:38:26

我本来想把swfupload集成到ckeditor的,看样子那必须得修改ck的核心源码。还是放弃算了
回复 2# Hex
是我对flash不了解,对正常的上传也不甚了解,flash上传也有其不好之处啊……问一下:mine类型可以伪装吗?

Hex 发表于 2010-6-28 10:27:18

mime 这个 http header 当然可以伪造。
最最保险的就是根据文件内容检查,这个是有检测工具的,PHP 就有。

nanwangnongfu 发表于 2011-12-5 10:24:41

学习了。现在正在集成swfupload

a123123 发表于 2012-1-2 23:01:07

能跨域上传么?
从www.a.com 传到 img.a.com

likely_01 发表于 2012-1-5 15:07:46

的确比自己写的好看

→世事是实 发表于 2012-8-2 10:23:54

a123123 发表于 2012-1-2 23:01 static/image/common/back.gif
能跨域上传么?
从www.a.com 传到 img.a.com

不能。。只能通过选传到www.a.com然后在通过PHP里的FTP函数传到img.a.com

服务器正忙,正 发表于 2013-11-21 11:07:46

楼住能不能贴个代码,研究下,我在弄这个,就是怎么在控制器接收上传的数据并插入到数据库,失败了,希望学习下你的代码{:1_1:}
页: [1] 2
查看完整版本: 致所有想要使用swfupload的人们