html 表单上传图片

html-css013

html 表单上传图片,第1张

使用表单中的文件域(<input type="file".../>)控件可以上传文件。

打开DreamWeaver,这里使用的版本是CS6,新建一个php文件。

保存到网站目录下,命名为upload.php。

在代码中插入一个表单

对话框中,操作留空,方法选择“post”,编码类型输入“multipart/form-data”,名称命名为“upload_form”,其中编码类型必须为“multipart/form-data”。点击确定,产生的代码如下:

<body>

<form action="" method="post" enctype="multipart/form-data" name="upload_form"></form>

</body>

接下来在form中插入一个标签控件、一个文件域控件和一个上传按钮。

结果如下:

<body>

<form action="" method="post" enctype="multipart/form-data" name="upload_form">

<label>选择图片文件</label>

<input name="imgfile" type="file" accept="image/gif, image/jpeg"/>

<input name="upload" type="submit" value="上传" />

</form>

</body>

不同的浏览器,对于文件域控件的显示不同,IE9浏览器和FireFox中的预览效果都要看一下

代码中,重要的是名为imgfile的文件域控件,type属性为“file”,表示这是一个文件域控件。

accept属性表示点击“浏览...”按钮时,弹出的打开对话框中的文件类型。accept="image/gif, image/jpeg"表示我们只想在文件打开对话框中显示后缀名为“gif”和“jpg”、“jpeg”的文件。对于此属性,有些浏览器并不支持。比如在IE9中,此属性不起任何作用。在chrome中,此属性起作用。

如果想支持所有的图像文件,accept值可以设置为“image/*”,在chrome中,文件类型显示

好了,html代码就写完了,因为action="",表示点击上传按钮时,将表单提交给自身,因此,我们还要添加接收表单的处理代码。

代码如下:

<?php

if (isset($_FILES['imgfile'])

&&is_uploaded_file($_FILES['imgfile']['tmp_name']))

{

$imgFile = $_FILES['imgfile']

$imgFileName = $imgFile['name']

$imgType = $imgFile['type']

$imgSize = $imgFile['size']

$imgTmpFile = $imgFile['tmp_name']

move_uploaded_file($imgTmpFile, 'upfile/'.$imgFileName)

$validType = false

$upRes = $imgFile['error']

if ($upRes == 0)

{

if ($imgType == 'image/jpeg'

|| $imgType == 'image/png'

|| $imgType == 'image/gif')

{

$validType = true

}

if ($validType)

{

$strPrompt = sprintf("文件%s上传成功<br>"

. "文件大小: %s字节<br>"

. "<img src='upfile/%s'>"

, $imgFileName, $imgSize, $imgFileName

)

echo $strPrompt

}

}

}

?>

代码分析:

$_FILES是一个数组变量,用于保存上传后的文件信息。

$_FILES['imgfile']表示文件域名称为'imgfile'的控件提交服务器后,上传的文件的信息。

一个上传的文件,有以下属性信息:

'name': 上传的文件在客户端的名称。

'type': 文件的 MIME 类型,例如"image/jpeg"。

'size': 已上传文件的大小,单位为字节。

'tmp_name':上传时,在服务器端,会把上传的文件保存到一个临时文件夹中,可以通过此属性得到临时文件名。

'error':文件在上传过程中的错误代码。如果上传成功,此值为0,其它值的意义如下:

1:超过了php.ini中设置的上传文件大小。

2:超过了MAX_FILE_SIZE选项指定的文件大小。

3:文件只有部分被上传。

4:文件未被上传。

5:上传文件大小为0。

代码中首先判断$_FILES['imgfile']变量是否存在,如果存在,并且$_FILES['imgfile']['tmp_name']变量所指文件被上传了,判断error属性,如果属性为0,把上传后的图像从临时文件夹移到upfile文件夹中,显示上传文件的信息,并显示上传后的图像。

如果error值不为0,表示上传失败,显示失败信息。

完成的代码如下:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "www.mobiletrain.org /TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="www.mobiletrain.org ">

<head>

<meta http-equiv="Content-Type" content="text/htmlcharset=utf-8" />

<title>上传图片文件</title>

</head>

<?php

if (isset($_FILES['imgfile'])

&&is_uploaded_file($_FILES['imgfile']['tmp_name']))

{

$imgFile = $_FILES['imgfile']

$upErr = $imgFile['error']

if ($upErr == 0)

{

$imgType = $imgFile['type']//文件类型。

/* 判断文件类型,这个例子里仅支持jpg和gif类型的图片文件。*/

if ($imgType == 'image/jpeg'

|| $imgType == 'image/gif')

{

$imgFileName = $imgFile['name']

$imgSize = $imgFile['size']

$imgTmpFile = $imgFile['tmp_name']

/* 将文件从临时文件夹移到上传文件夹中。*/

move_uploaded_file($imgTmpFile, 'upfile/'.$imgFileName)

/*显示上传后的文件的信息。*/

$strPrompt = sprintf("文件%s上传成功<br>"

. "文件大小: %s字节<br>"

. "<img src='upfile/%s'>"

, $imgFileName, $imgSize, $imgFileName

)

echo $strPrompt

}

else

{

echo "请选择jpg或gif文件,不支持其它类型的文件。"

}

}

else

{

echo "文件上传失败。<br>"

switch ($upErr)

{

case 1:

echo "超过了php.ini中设置的上传文件大小。"

break

case 2:

echo "超过了MAX_FILE_SIZE选项指定的文件大小。"

break

case 3:

echo "文件只有部分被上传。"

break

case 4:

echo "文件未被上传。"

break

case 5:

echo "上传文件大小为0"

break

}

}

}

else

{

/*显示表单。*/

?>

<body>

<form action="" method="post" enctype="multipart/form-data" name="upload_form">

<label>选择图片文件</label>

<input name="imgfile" type="file" accept="image/gif, image/jpeg"/>

<input name="upload" type="submit" value="上传" />

</form>

</body>

<?php

}

?>

</html>

1.1 分片、并发

分片与并发结合,将一个大文件分割成多块,并发上传,极大地提高大文件的上传速度。

当网络问题导致传输错误时,只需要重传出错分片,而不是整个文件。另外分片传输能够更加实时的跟踪上传进度。

1.2 预览、压缩

支持常用图片格式jpg,jpeg,gif,bmp,png预览与压缩,节省网络数据传输。

解析jpeg中的meta信息,对于各种orientation做了正确的处理,同时压缩后上传保留图片的所有原始meta数据。

1.3 多途径添加文件

支持文件多选,类型过滤,拖拽(文件&文件夹),图片粘贴功能。

粘贴功能主要体现在当有图片数据在剪切板中时(截屏工具如QQ(Ctrl + ALT + A), 网页中右击图片点击复制),Ctrl + V便可添加此图片文件。

1.4 HTML5 &FLASH

兼容主流浏览器,接口一致,实现了两套运行时支持,用户无需关心内部用了什么内核。

同时Flash部分没有做任何UI相关的工作,方便不关心flash的用户扩展和自定义业务需求。

1.5 MD5秒传

当文件体积大、量比较多时,支持上传前做文件md5值验证,一致则可直接跳过。

如果服务端与前端统一修改算法,取段md5,可大大提升验证性能,耗时在20ms左右。

1.6 易扩展、可拆分

采用可拆分机制, 将各个功能独立成了小组件,可自由搭配。

采用AMD规范组织代码,清晰明了,方便高级玩家扩展。

2、引入资源

2.1 下载包内容

├── Uploader.swf // SWF文件,当使用Flash运行时需要引入。

├── webuploader.js // 完全版本。

├── webuploader.min.js // min版本

├── webuploader.flashonly.js // 只有Flash实现的版本。

├── webuploader.flashonly.min.js // min版本

├── webuploader.html5only.js // 只有Html5实现的版本。

├── webuploader.html5only.min.js // min版本

├── webuploader.withoutimage.js // 去除图片处理的版本,包括HTML5和FLASH.

└── webuploader.withoutimage.min.js // min版本

2.2 或者直接使用由staticfile提供的cdn版本,或者下载Git项目包。

// SWF文件,当使用Flash运行时需要引入。

├── http://cdn.staticfile.org/webuploader/0.1.0/Uploader.swf

// 完全版本。

├── http://cdn.staticfile.org/webuploader/0.1.0/webuploader.js

├── http://cdn.staticfile.org/webuploader/0.1.0/webuploader.min.js

// 只有Flash实现的版本。

├── http://cdn.staticfile.org/webuploader/0.1.0/webuploader.flashonly.js

├── http://cdn.staticfile.org/webuploader/0.1.0/webuploader.flashonly.min.js

// 只有Html5实现的版本。

├── http://cdn.staticfile.org/webuploader/0.1.0/webuploader.html5only.js

├── http://cdn.staticfile.org/webuploader/0.1.0/webuploader.html5only.min.js

// 去除图片处理的版本,包括HTML5和FLASH.

├── http://cdn.staticfile.org/webuploader/0.1.0/webuploader.withoutimage.js

└── http://cdn.staticfile.org/webuploader/0.1.0/webuploader.withoutimage.min.js

2.3 DIY打包

WebUploader文件打包借助了Grunt工具来实现

2.3.1 环境依赖

1.git命令行工具

2.node &npm命令行工具

3.grunt (npm install grunt-cli -g)

2.3.2 编译代码

1.克隆 webuploader git仓库,git clone https://github.com/fex-team/webuploader.git。

2.安装node依赖,npm install。

3.执行grunt dist,此动作会在dist目录下面创建合并版本的js, 包括通过uglify压缩的min版本。

2.3.3 配置

打开webuploader仓库根目录下面的Gruntfile.js文件, 代码合并有buildtask来完成。找到build配置项。

Gruntfile.js已经配置了一个自定义合并的demo. 打包只支持HTML5的版本

// 自己配置的实例

// glob语法。

custom: {

preset: "custom",

cwd: "src",

src: [

'widgets/**/*.js',

'runtime/html5/**/*.js' ],

dest: "dist/webuploader.custom.js"

}

3、angular指令——<web-uploader>

3.1 指令功能

添加一个上传文件按钮,可以自行配置上传文件的类型和过滤规则,且在弹出的模态框中进行操作,支持连续上传,分类选择上传

3.2 使用说明

这里只是使用说明,可能会加一些注意事项,具体参数或者变量说明请参看后面

3.2.1 页面添加一个指令

<web-uploader class="btn btn-info" type="image" accept="accept">uploader</web-uploader>

3.2.2 配置上传类型和过滤规则

上传类型

type有四种类型,分别为

image:图片

video:音视频

flash:flash

file:办公文档,压缩文件等等

过滤规则

accept有四个对象属性,属性中包含标题、允许文件后缀、允许的mimetype

3.2.3 指令中绑定弹出模态框的事件

web-uploader这个指令中其实只做了一件事,给元素本身绑定弹出模态框的事件,具体上传文件是在模态框中完成的

3.2.4 初始化uploader类,配置相关属性

在模态框控制器中用到了$timeout

$timeout(function(){

//这里是上传配置代码

},0)

因为配置uploader时需要事先准备好dom元素,angular打开模态框是异步而JavaScript是单线程,所以实际上在执行模态框控制器中的代码时,模态框并没有打开,也就是dom并没有加载完成,这会导致WebUploader报a.runningtime is not a function...的错误

3.3 指令详细说明

3.3.1 父级controller中的配置

.controller('myCtrl',['$scope', '$modal', function($scope, $modal){

//配置允许上传的类型 图片/音视频/flash/文件

$scope.accept = {

//图片

image: {

title : 'Images',//标题

extensions : 'gif,jpg,jpeg,bmp,png,ico',//允许上传文件的后缀

mimeTypes : 'image/*'//允许的mimetype

},

//音视频

video: {

title : 'Videos',

extensions : 'wmv,asf,asx,rm,rmvb,ram,avi,mpg,dat,mp4,mpeg,divx,m4v,mov,qt,flv,f4v,mp3,wav,aac,m4a,wma,ra,3gp,3g2,dv,vob,mkv,ts',

mimeTypes : 'video/*,audio/*'

},

//flash

flash: {

title : 'Flashs',

extensions : 'swf,fla',

mimeTypes : 'application/x-shockwave-flash'

},

//办公文档,压缩文件等等

file: {

title : 'Files',

extensions : 'zip,rar,ppt,pptx,doc,docx,xls,xlsx,pdf',

mimeTypes : 'application/zip,application/x-rar-compressed,application/vnd.ms-powerpoint,application/vnd.openxmlformats- officedocument.presentationml.presentation,application/msword,application/vnd.openxmlformats-officedocument.wordprocessingml.document,application/vnd.ms- excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/pdf'

}

}

}])

3.3.2 指令web-uploader

.directive('webUploader', ['$modal', function($modal){

return{

restrict: 'AE',

scope: {

accept: '=accept'

},

link: function($scope, $element, $attr){

$element.bind('click',function(){

var modalInstance = $modal.open({

controller: 'modalCtrl',

templateUrl: 'template/webuploader.tpl.html',

size:'lg',

resolve: {

items: function(){

return {

accept: $scope.accept,

type: $attr.type

}

}

}

})

modalInstance.result.then(function(returnStatus){

console.log(returnStatus)

},function(){

console.log('Modal dismissed at: ' + new Date())

})

})

}

}

}])