5a739853
patrick.he
commit
|
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
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
|
<?php
//please note that request will fail if you upload a file larger
//than what is supported by your PHP or Webserver settings
sleep(1);//to simulate some delay for local host
//is this an ajax request or sent via iframe(IE9 and below)?
$ajax = isset($_SERVER['HTTP_X_REQUESTED_WITH']) && $_SERVER['HTTP_X_REQUESTED_WITH']==='XMLHttpRequest';
//our operation result including `status` and `message` which will be sent to browser
$result = array();
$file = $_FILES['avatar'];
if( is_string($file['name']) ) {
//single file upload, file['name'], $file['type'] will be a string
$result[] = validateAndSave($file);
}
else if( is_array($file['name']) ) {
//multiple files uploaded
$file_count = count($file['name']);
//in PHP if you upload multiple files with `avatar[]` name, $file['name'], $file['type'], etc will be an array
for($i = 0; $i < $file_count; $i++) {
$file_info = array(
'name' => $file['name'][$i],
'type' => $file['type'][$i],
'size' => $file['size'][$i],
'tmp_name' => $file['tmp_name'][$i],
'error' => $file['error'][$i]
);
$result[] = validateAndSave($file_info);
}
}
$result = json_encode($result);
if($ajax) {
//if request was ajax(modern browser), just echo it back
echo $result;
}
else {
//if request was from an older browser not supporting ajax upload
//then we have used an iframe instead and the response is sent back to the iframe as a script
echo '<script language="javascript" type="text/javascript">';
echo 'window.top.window.jQuery("#'.$_POST['temporary-iframe-id'].'").data("deferrer").resolve('.$result.');';
echo '</script>';
}
function validateAndSave($file) {
$result = array();
if(!preg_match('/^image\//' , $file['type'])
//if file type is not an image
|| !preg_match('/\.(jpe?g|gif|png)$/' , $file['name'])
//or extension is not valid
|| getimagesize($file['tmp_name']) === FALSE
//or file info such as its size can't be determined, so probably an invalid image file
)
{
//then there is an error
$result['status'] = 'ERR';
$result['message'] = 'Invalid file format!';
}
else if($file['size'] > 110000) {
//if size is larger than what we expect
$result['status'] = 'ERR';
$result['message'] = 'Please choose a smaller file!';
}
else if($file['error'] != 0 || !is_uploaded_file($file['tmp_name'])) {
//if there is an unknown error or temporary uploaded file is not what we thought it was
$result['status'] = 'ERR';
$result['message'] = 'Unspecified error!';
}
else {
//save file inside current directory using a safer version of its name
$save_path = preg_replace('/[^\w\.\- ]/', '', $file['name']);
//thumbnail name is like filename-thumb.jpg
$thumb_path = preg_replace('/\.(.+)$/' , '', $save_path).'-thumb.jpg';
if(
//if we were not able to move the uploaded file from its temporary location to our desired path
!move_uploaded_file($file['tmp_name'] , $save_path)
OR
//or unable to resize image to our desired size
!resize($save_path, $thumb_path, 150)
)
{
$result['status'] = 'ERR';
$result['message'] = 'Unable to save file!';
}
else {
//everything seems OK
$result['status'] = 'OK';
$result['message'] = 'Avatar changed successfully!';
//include new thumbnails `url` in our result and send to browser
$result['url'] = 'http://'.$_SERVER['HTTP_HOST'].dirname($_SERVER['SCRIPT_NAME']).'/'.$thumb_path;
}
}
return $result;
}
function resize($in_file, $out_file, $new_width, $new_height=FALSE)
{
$image = null;
$extension = strtolower(preg_replace('/^.*\./', '', $in_file));
switch($extension)
{
case 'jpg':
case 'jpeg':
$image = imagecreatefromjpeg($in_file);
break;
case 'png':
$image = imagecreatefrompng($in_file);
break;
case 'gif':
$image = imagecreatefromgif($in_file);
break;
}
if(!$image || !is_resource($image)) return false;
$width = imagesx($image);
$height = imagesy($image);
if($new_height === FALSE)
{
$new_height = (int)(($height * $new_width) / $width);
}
$new_image = imagecreatetruecolor($new_width, $new_height);
imagecopyresampled($new_image, $image, 0, 0, 0, 0, $new_width, $new_height, $width, $height);
$ret = imagejpeg($new_image, $out_file, 80);
imagedestroy($new_image);
imagedestroy($image);
return $ret;
}
|