« 2010年3月的文章归档

浅析FileReference与FileReferenceList类

FileReference:在客户端和服务器之间添加上载和下载文件的功能,位于flash.net包内

FileReferenceList: 实现多文件上传,位于flash.net包内.

相关方法有:

  • browse: 打开对话窗口,供用户选择文件
  • upload: 上传
  • download: 下载
  • cancel: 取消上传或下载

常用事件有:

  • Event.SELECT:选择文件后调度
  • ProgressEvent.PROGRESS :传输中调度
  • Event.COMPLETE :当下载操作完成或上载操作生成 HTTP 状态代码 200 时调度。
  • DataEvent.UPLOAD_COMPLETE_DATA :成功上载并从服务器接收数据之后调度
  • Event.CANCEL:取消上传或下载时调度
  • IOErrorEvent.IO_ERROR:上传下载失败时调度

辅助类:flash.net.FileFilter,文件过滤器

var imageTypes:FileFilter = new FileFilter("Images (*.jpg, *.jpeg, *.gif, *.png)", "*.jpg; *.jpeg; *.gif; *.png");
var textTypes:FileFilter = new FileFilter("Text Files (*.txt, *.rtf)", "*.txt; *.rtf");
var allTypes:Array = new Array(imageTypes, textTypes);
var fileRef:FileReference = new FileReference();
fileRef.browse(allTypes);

示例(手册上有):
1)单文件上传

var fileRef:FileReference = new FileReference();
fileRef.addEventListener(Event.SELECT, selectHandler);
fileRef.addEventListener(Event.COMPLETE, completeHandler);
var success:Boolean = fileRef.browse();
function selectHandler(event:Event):void
{
    var request:URLRequest = new URLRequest("fileUploadScript.php")
    fileRef.upload(request);
}
function completeHandler(event:Event):void
{
    trace("uploaded");
}

2.多文件上传

var fileRefList:FileReferenceList = new FileReferenceList();
fileRefList.addEventListener(Event.SELECT, selectHandler);
fileRefList.browse();
function selectHandler(event:Event):void
{
    var request:URLRequest = new URLRequest("fileUploadScript.php");
    var file:FileReference;
    var files:FileReferenceList = FileReferenceList(event.target);
    var selectedFileArray:Array = files.fileList;
    for (var i:uint = 0; i < selectedFileArray.length; i++)
    {
        file = FileReference(selectedFileArray[i]);
        file.addEventListener(Event.COMPLETE, completeHandler);
        file.upload(request);
    }
}
function completeHandler(event:Event):void
{
    trace("uploaded");
}

可以看出,单多文件上传,除了用的类不一样外,多文件上传只是遍历FileReferenceList的fileList属性,该属性是一个包括FileReference的数组,每个遍历调用upload,从而实现多文件上传。

后台处理程序,同样来至手册:

<?php
$MAXIMUM_FILESIZE = 1024 * 200; // 200KB
$MAXIMUM_FILE_COUNT = 10; // keep maximum 10 files on server
echo exif_imagetype($_FILES['Filedata']);
if ($_FILES['Filedata']['size'] <= $MAXIMUM_FILESIZE)
{
    move_uploaded_file($_FILES['Filedata']['tmp_name'], "./temporary/".$_FILES['Filedata']['name']);
    $type = exif_imagetype("./temporary/".$_FILES['Filedata']['name']);
    if ($type == 1 || $type == 2 || $type == 3)
    {
        rename("./temporary/".$_FILES['Filedata']['name'], "./images/".$_FILES['Filedata']['name']);
    }
    else
    {
        unlink("./temporary/".$_FILES['Filedata']['name']);
    }
}
$directory = opendir('./images/');
$files = array();
while ($file = readdir($directory))
{
    array_push($files, array('./images/'.$file, filectime('./images/'.$file)));
}
usort($files, sorter);
if (count($files) > $MAXIMUM_FILE_COUNT)
{
    $files_to_delete = array_splice($files, 0, count($files) - $MAXIMUM_FILE_COUNT);
    for ($i = 0; $i < count($files_to_delete); $i++)
    {
        unlink($files_to_delete[$i][0]);
    }
}
print_r($files);
closedir($directory);

function sorter($a, $b)
{
    if ($a[1] == $b[1])
    {
        return 0;
    }
    else
    {
        return ($a[1] < $b[1]) ? -1 : 1;
    }
}
?>

【C++ Primer】读书笔记 一

  1. 每个程序必需有一个main函数,此为执行入口;返回值必需为int型,“0”表示执行成功。
  2. 函数组成部分:
    1)返回类型
    2)函数名
    3)参数
    4)函数体
    例:

    				#include
    				int main()
    				{
    					return 0
    				}
    			
  3. C++源文件后缀与所运行的纺译器有关
    1).cc
    2).cxx
    3).cpp
    4).cp
    5).c
  4. IO库:iostream
    1)cin(读作 see-in),标准输入
    2)cout(读作 see-out),标准输出
    3)cerr(读作 see-err),标准错误
    4)clog(读作 see-log),产生执行一般信息
    例:

    				#include >iostream<
    				int main()
    				{
    					std::cout << "Enter two numbers:" << std::endl;
    					int v1 , v2;
    					std::cin >> v1 >> v2;
    					std::cout << "The sum of " << v1 << " and " << v2
    							  << " is " << v1 + v2 << std::endl;
    					return 0;
    				}
    			

    5)

    				#include <iostream>
    				

    第一行是一个预处理指示
    尖括号中的名字叫头文件
    std:命名空间
    endl:操纵符,具有输出换行的效果,关刷新设备缓冲区
    <<:输出操作符
    >>:输入操作符

  5. //:单行注释
    /**/:多行注释
    ,注意不要嵌套。
  6. if
    while
    for
  7. 未知数目的输入

    				#include <iostream>
    				int main()
    				{
    					int sum = 0 , value;
    					while (std::cin >> value)
    						sum += value;
    					std::cout << "Sum is: " << sum << std::endl;
    					return 0;
    				}
    			
  8. 使用自定义类

    				#include <iostream>
    				#include "Sales_item.h"
    				int main()
    				{
    					Sales_item book;
    					std::cin >> book;
    					std::cout << book << std::endl;
    					return 0;
    				}
    			
  9. include标准库用”<>”
    include自定义类型用引号

    				#include <iostream>
    				#include "Sales_item.h"
    			
  10. 调用成员函数

    			item1.same_isbn(item2)
    			
  11. 一个简单完整的程序

    				#include <iostream>
    				#include "Sales_item.h"
    
    				int main()
    				{
    					// declare variables to hold running sum and data for the next record
    					Sales_item total, trans;
    
    					// is there data to process?
    					if (std::cin >> total) {
    						// if so, read the transaction records
    						while (std::cin >> trans)
    							if (total.same_isbn(trans))
    								// match: update the running total
    								total = total + trans;
    							else {
    								// no match: print & assign to total
    								std::cout << total << std::endl;
    								total = trans;
    							}
    						// remember to print last record
    						std::cout << total << std::endl;
    					} else {
    						// no input!, warn the user
    						std::cout << "No data?!" << std::endl;
    						return -1;  // indicate failure
    					}
    
    					return 0;
    				}