本文实例讲述了thinkPHP5框架整合plupload实现图片批量上传功能的方法。分享给大家供大家参考,具体如下:
在官网下载plupload http://http//www.plupload.com
或者点击此处本站下载。
这里我们使用的是pluploadQueue
在HTML页面引入相应的css和js,然后根据示例代码修改为自己的代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
<link rel= "stylesheet" href= "/assets/plupupload/css/jquery.plupload.queue.css" rel= "external nofollow" type= "text/css" media= "screen" />
<div class= "form-box-header" ><h3>{:lang( 'photo' )}</h3></div>
<div class= "t-d-in-editor" >
<div class= "t-d-in-box" >
<div id= "uploader" >
<p>{:lang( 'plupupload_tip' )}</p>
</div>
<div id= "uploaded" ></div>
</div>
</div>
<script type= "text/javascript" src= "/assets/plupupload/plupload.full.min.js" ></script>
<script type= "text/javascript" src= "/assets/plupupload/jquery.plupload.queue.js" ></script>
<script type= "text/javascript" >
$( function () {
// Setup html5 version
$( "#uploader" ).pluploadQueue({
// General settings
runtimes : 'html5,flash,silverlight,html4' ,
url : '{:url("photo/upphoto")}' ,
chunk_size: '1mb' ,
rename : true ,
dragdrop: true ,
filters : {
// Maximum file size
max_file_size : '10mb' ,
// Specify what files to browse for
mime_types: [
{title : "Image files" , extensions : "jpg,gif,png" }
]
},
// Resize images on clientside if we can
resize : {width : 320, height : 240, quality : 90},
flash_swf_url : '/assets/plupupload/Moxie.swf' ,
silverlight_xap_url : '/assets/plupupload/Moxie.xap' ,
init: {
PostInit: function () {
$( '#uploaded' ).html( "" );
},
FileUploaded : function (uploader , files, result) {
up_image = result.response;
if (up_image != "" ){
$( "#uploaded" ).append( "<input type='hidden' name='images[]' value='" +up_image+ "'/>" ); //这里获取到上传结果
}
}
}
});
});
</script>
|
plupload整合:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
|
<?php
/*
* 文件上传
*
* Donald
* 2017-3-21
*/
namespace app\backend\logic;
use think\Model;
class Plupupload extends Model{
public function upload_pic( $file_type = "data" ){
#!! IMPORTANT:
#!! this file is just an example, it doesn't incorporate any security checks and
#!! is not recommended to be used in production environment as it is. Be sure to
#!! revise it and customize to your needs.
// Make sure file is not cached (as it happens for example on iOS devices)
header( "Expires: Mon, 26 Jul 1997 05:00:00 GMT" );
header( "Last-Modified: " . gmdate ( "D, d M Y H:i:s" ) . " GMT" );
header( "Cache-Control: no-store, no-cache, must-revalidate" );
header( "Cache-Control: post-check=0, pre-check=0" , false);
header( "Pragma: no-cache" );
/*
// Support CORS
header("Access-Control-Allow-Origin: *");
// other CORS headers if any...
if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {
exit; // finish preflight CORS requests here
}
*/
// 5 minutes execution time
@set_time_limit(5 * 60);
// Uncomment this one to fake upload time
// usleep(5000);
// Settings
//重新设置上传路径
$uploads = config( 'uploads_dir' );
if (! empty ( $file_type )){
$uploads = $uploads . $file_type . "/" . date ( "Ymd" );
}
$targetDir = $uploads ;
//$targetDir = 'uploads';
$cleanupTargetDir = true; // Remove old files
$maxFileAge = 5 * 3600; // Temp file age in seconds
// Create target dir
if (! file_exists ( $targetDir )) {
@ mkdir ( $targetDir );
}
// Get a file name
if (isset( $_REQUEST [ "name" ])) {
$fileName = $_REQUEST [ "name" ];
} elseif (! empty ( $_FILES )) {
$fileName = $_FILES [ "file" ][ "name" ];
} else {
$fileName = uniqid( "file_" );
}
//重命名文件
$fileName_arr = explode ( "." , $fileName );
$fileName = myrule(). "." . $fileName_arr [1]; //rule()请查看上篇我的上篇博客thinkphp同时上传多张图片文件重名问题
$filePath = $targetDir . DIRECTORY_SEPARATOR . $fileName ;
// Chunking might be enabled
$chunk = isset( $_REQUEST [ "chunk" ]) ? intval ( $_REQUEST [ "chunk" ]) : 0;
$chunks = isset( $_REQUEST [ "chunks" ]) ? intval ( $_REQUEST [ "chunks" ]) : 0;
// Remove old temp files
if ( $cleanupTargetDir ) {
if (! is_dir ( $targetDir ) || ! $dir = opendir( $targetDir )) {
die ( '{"jsonrpc" : "2.0", "error" : {"code": 100, "message": "Failed to open temp directory."}, "id" : "id"}' );
}
while (( $file = readdir( $dir )) !== false) {
$tmpfilePath = $targetDir . DIRECTORY_SEPARATOR . $file ;
// If temp file is current file proceed to the next
if ( $tmpfilePath == "{$filePath}.part" ) {
continue ;
}
// Remove temp file if it is older than the max age and is not the current file
if (preg_match( '/\.part$/' , $file ) && ( filemtime ( $tmpfilePath ) < time() - $maxFileAge )) {
@unlink( $tmpfilePath );
}
}
closedir ( $dir );
}
// Open temp file
if (! $out = @ fopen ( "{$filePath}.part" , $chunks ? "ab" : "wb" )) {
die ( '{"jsonrpc" : "2.0", "error" : {"code": 102, "message": "Failed to open output stream."}, "id" : "id"}' );
}
if (! empty ( $_FILES )) {
if ( $_FILES [ "file" ][ "error" ] || ! is_uploaded_file ( $_FILES [ "file" ][ "tmp_name" ])) {
die ( '{"jsonrpc" : "2.0", "error" : {"code": 103, "message": "Failed to move uploaded file."}, "id" : "id"}' );
}
// Read binary input stream and append it to temp file
if (! $in = @ fopen ( $_FILES [ "file" ][ "tmp_name" ], "rb" )) {
die ( '{"jsonrpc" : "2.0", "error" : {"code": 101, "message": "Failed to open input stream."}, "id" : "id"}' );
}
} else {
if (! $in = @ fopen ( "php://input" , "rb" )) {
die ( '{"jsonrpc" : "2.0", "error" : {"code": 101, "message": "Failed to open input stream."}, "id" : "id"}' );
}
}
while ( $buff = fread ( $in , 4096)) {
fwrite( $out , $buff );
}
@fclose( $out );
@fclose( $in );
// Check if file has been uploaded
if (! $chunks || $chunk == $chunks - 1) {
// Strip the temp .part suffix off
rename( "{$filePath}.part" , $filePath );
}
// Return Success JSON-RPC response
die ( $filePath ); //这里直接返回结果
// die('{"jsonrpc" : "2.0", "result" : "'.$filePath.'", "id" : "id"}');
}
}
|
最后Controller或Model获取结果并保存
1
2
|
$images = $request ->post( 'images/a' ); //这里一定要注意, thinkphp通过name获取post数组时会获取不到数据,需要在name后加/a,表示获取数组详见Request的typeCast
model( 'PhotoImage' )->query_insert( $images , $id ); //批量插入图片
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
/**
* 强制类型转换
* @param string $data
* @param string $type
* @return mixed
*/
private function typeCast(& $data , $type )
{
switch ( strtolower ( $type )) {
// 数组
case 'a' :
$data = ( array ) $data ;
break ;
// 数字
case 'd' :
$data = (int) $data ;
break ;
// 浮点
case 'f' :
$data = (float) $data ;
break ;
// 布尔
case 'b' :
$data = (boolean) $data ;
break ;
// 字符串
case 's' :
default :
if ( is_scalar ( $data )) {
$data = (string) $data ;
} else {
throw new \InvalidArgumentException( 'variable type error:' . gettype ( $data ));
}
}
}
|
希望本文所述对大家基于ThinkPHP框架的PHP程序设计有所帮助。
原文链接:http://blog.csdn.net/tang05709/article/details/70332398