-
Notifications
You must be signed in to change notification settings - Fork 27
/
11.html
478 lines (478 loc) · 47.1 KB
/
11.html
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
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gbk" />
<title>第十一章 使用 CI 处理文件和图片</title>
<link href="css/main.css" rel="stylesheet" type="text/css" />
<script type="text/javascript" src="js/main.js"></script>
</head>
<body>
<div id="container"><a name="top"></a>
<div id="header">
<div class="title"><a href="10.html">上一页</a> | <a href="12.html">下一页</a> | <a href="table_of_contents.html">目录</a> | <a href="#bottom">转到页尾</a></div>
</div>
<div id="content">
<div class="main">
<h1>第十一章 使用 CI 处理文件和图片</h1>
<p>本章看几个有用的 CI 功能和辅助函数。他们中的每一个都是如何用几行 CI 代码无逢存取一系列应用和动作的好例子,如果从头开始编码的话你需要具备许多专业知识。在许多情况下,CI 提供一个对已有类的简单接口,这些类可能是你从 PEAR 或者其他源代码中提取的。但 CI 给你一个标准接口:你只需把它作为本地 CI 代码,并且框架向你提供所有接口的内容。</p>
<p>让我们看看本章中的五个内容:</p>
<ul>
<li>文件辅助函数让我们很容易的读写文件。</li>
<li>下载辅助函数让用户直接下载你网站上的文件,而不是显示他们为 HTML。</li>
<li>文件上传类以其他方式工作,他允许用户存储文件到你的网站,并有内建的安全措施以限制用户的行为。</li>
<li>图像处理类允许你给图片做几个有用的处理,我们将看看如何调整图片的大小和给图片加水印。</li>
<li>最后,Zip 类允许你的用户下载文件之前压缩它。</li>
</ul>
<p>这里的每一个例子都暗藏着许多聪明的代码实现,并且允许你以最小的代价写出实际的应用。在很多例子中,增加了一些额外的代码以使其更健壮。</p>
<p>让我们一个接一个的看看:</p>
<a name="C_11_1"></a>
<h2>11.1 文件辅助函数</h2>
<p>第一次学习 PHP 的读写文件的语法是不容易掌握的。CI 的文件辅助函数包含许多有用的函数,他封装了 PHP 自己的文件处理操作。开始一如既往的装载这个辅助函数:</p>
<div class="code">
<div class="title">
<div style="float:right"><img class="copyCodeImage" src="images/copycode.gif" alt="" /><a href="javascript:void(0)" onclick="CopyCode(this)">复制代码到剪贴板</a></div>
<div style="clear:none">PHP 代码</div>
</div>
<pre class="php"><span style="color: #0000ff;">$this</span>-><span style="color: #006600;">load</span>-><span style="color: #006600;">helper</span><span style="color: #66cc66;">(</span><span style="color: #ff0000;">'file'</span><span style="color: #66cc66;">)</span>;</pre>
</div>
<a name="I_file_writing"></a>
<p>然后生活得到了很多简化。例如,写文件,你需要知道的是:</p>
<ul>
<li>你的文件的位置。</li>
<li>你想写入的文本。</li>
<li>你想以什么模式打开文件。模式定义在 PHP 手册中(看“fopen”这页)。它们包含“r”为读,“w”为写(写入文件,覆盖已存在的数据),“a”为追加(写入文件,在已存在的数据后添加)。每种情况下,添加一个“+”,例如“a+”,打开文件以进行读写操作。“a”和“w”,而不是“r”或“r+”,如果没有的话,总是创建文件。</li>
</ul>
<p>然后你使用这三个信息作为 write_file() 函数的参数:</p>
<div class="code">
<div class="title">
<div style="float:right"><img class="copyCodeImage" src="images/copycode.gif" alt="" /><a href="javascript:void(0)" onclick="CopyCode(this)">复制代码到剪贴板</a></div>
<div style="clear:none">PHP 代码</div>
</div>
<pre class="php">write_file<span style="color: #66cc66;">(</span><span style="color: #ff0000;">'e:/filetest.txt'</span>, <span style="color: #ff0000;">'hello world'</span>, <span style="color: #ff0000;">'a+'</span><span style="color: #66cc66;">)</span>;</pre>
</div>
<p>这比 PHP 的两步代码更简单、更直观:</p>
<div class="code">
<div class="title">
<div style="float:right"><img class="copyCodeImage" src="images/copycode.gif" alt="" /><a href="javascript:void(0)" onclick="CopyCode(this)">复制代码到剪贴板</a></div>
<div style="clear:none">PHP 代码</div>
</div>
<pre class="php"><span style="color: #b1b100;">if</span> <span style="color: #66cc66;">(</span> <span style="color: #0000ff;">$fp</span> = <a href="http://www.php.net/fopen"><span style="color: #000066;">fopen</span></a><span style="color: #66cc66;">(</span><span style="color: #ff0000;">'e:/filetest.txt'</span>,<span style="color: #ff0000;">'r+'</span><span style="color: #66cc66;">)</span><span style="color: #66cc66;">)</span>
<span style="color: #66cc66;">{</span>
<a href="http://www.php.net/fwrite"><span style="color: #000066;">fwrite</span></a><span style="color: #66cc66;">(</span><span style="color: #0000ff;">$fp</span>, <span style="color: #ff0000;">'hello world'</span><span style="color: #66cc66;">)</span>;
<span style="color: #66cc66;">}</span></pre>
</div>
<p>其次,CI 代码添加了一点额外功能:它在写入之前自动锁定文件,写入后再解锁。如果没有发生文件操作,则辅助函数返回“FALSE”,所以你可以用它来报告成功或失败。你需要为你的文件指定一个文件名,但如果你不指定文件路径,它将保存在你站点的 web 根目录下,就是你的主 index.php 文件所在的位置。</p>
<p class="important">当然,在任何文件夹中你创建或写入文件必须具有写入权限。记住,如果你运行于一个 Windows 系统,你必须使用正斜杠 — /— 来描述你的文件路径。</p>
<p>在我们的应用程序中,我们可以把数据库工具类与这个辅助函数组合起来。这允许我们创建、备份、修复和优化数据库和表,虽然只适用于 MySQL 和 MySQLi 数据库。与文件辅助函数一起使用,你就可以创建一个不错的备份例程。</p>
<div class="code">
<div class="title">
<div style="float:right"><img class="copyCodeImage" src="images/copycode.gif" alt="" /><a href="javascript:void(0)" onclick="CopyCode(this)">复制代码到剪贴板</a></div>
<div style="clear:none">PHP 代码</div>
</div>
<pre class="php"><span style="color: #0000ff;">$this</span>-><span style="color: #006600;">load</span>-><span style="color: #006600;">dbutil</span><span style="color: #66cc66;">(</span><span style="color: #66cc66;">)</span>;
<span style="color: #0000ff;">$backup</span> =& <span style="color: #0000ff;">$this</span>-><span style="color: #006600;">dbutil</span>-><span style="color: #006600;">backup</span><span style="color: #66cc66;">(</span><span style="color: #66cc66;">)</span>;
<span style="color: #0000ff;">$this</span>-><span style="color: #006600;">load</span>-><span style="color: #006600;">helper</span><span style="color: #66cc66;">(</span><span style="color: #ff0000;">'file'</span><span style="color: #66cc66;">)</span>;
write_file<span style="color: #66cc66;">(</span><span style="color: #ff0000;">'e:/mybackup.gz'</span>, <span style="color: #0000ff;">$backup</span><span style="color: #66cc66;">)</span>;</pre>
</div>
<p>上面的代码将保存服务器上的最新版本的数据库到文件。</p>
<p>再次读取文件同样简单:</p>
<div class="code">
<div class="title">
<div style="float:right"><img class="copyCodeImage" src="images/copycode.gif" alt="" /><a href="javascript:void(0)" onclick="CopyCode(this)">复制代码到剪贴板</a></div>
<div style="clear:none">PHP 代码</div>
</div>
<pre class="php"><span style="color: #0000ff;">$content</span> = read_file<span style="color: #66cc66;">(</span><span style="color: #ff0000;">'e:/filetest.txt'</span><span style="color: #66cc66;">)</span>;</pre>
</div>
<a name="I_arrays_comparing"></a>
<p>还有个功能是,返回指定目录中的所有文件和文件夹,并以数组形式表示:</p>
<div class="code">
<div class="title">
<div style="float:right"><img class="copyCodeImage" src="images/copycode.gif" alt="" /><a href="javascript:void(0)" onclick="CopyCode(this)">复制代码到剪贴板</a></div>
<div style="clear:none">PHP 代码</div>
</div>
<pre class="php"><span style="color: #0000ff;">$filenames</span> = get_filenames<span style="color: #66cc66;">(</span><span style="color: #ff0000;">'e:/'</span><span style="color: #66cc66;">)</span>;</pre>
</div>
<p>不过,如果你在有很多文件的文件夹中使用它的话,你可能会发现 PHP 在把目录读取完毕前就超时了。你可以使用这个简单的代码片段,来检查你想要的文件或文件夹是否存在。首先,使用 CI 的函数查找文件,并定义一个要查找文件的数组,然后使用 array_diff() 比较它们。给出两个数组,array_diff() 告诉你在第一个数组中,但不在任何其它数组中的值,所以,你需要两次调用它,把每个数组都放在前面。</p>
<div class="code">
<div class="title">
<div style="float:right"><img class="copyCodeImage" src="images/copycode.gif" alt="" /><a href="javascript:void(0)" onclick="CopyCode(this)">复制代码到剪贴板</a></div>
<div style="clear:none">PHP 代码</div>
</div>
<pre class="php"><span style="color: #808080; font-style: italic;">//list files actually found</span>
<span style="color: #0000ff;">$files_there</span> = get_filenames<span style="color: #66cc66;">(</span><span style="color: #ff0000;">'e:/rootfolder/system/application/controllers'</span><span style="color: #66cc66;">)</span>;
<span style="color: #808080; font-style: italic;">// list files we expected</span>
<span style="color: #0000ff;">$files_expected</span> = <a href="http://www.php.net/array"><span style="color: #000066;">array</span></a><span style="color: #66cc66;">(</span><span style="color: #ff0000;">'start.php'</span>, <span style="color: #ff0000;">'index.php'</span><span style="color: #66cc66;">)</span>;
<span style="color: #808080; font-style: italic;">// any found that we didn't expect?</span>
<span style="color: #0000ff;">$difference</span> = <a href="http://www.php.net/array_diff"><span style="color: #000066;">array_diff</span></a><span style="color: #66cc66;">(</span><span style="color: #0000ff;">$files_there</span>, <span style="color: #0000ff;">$files_expected</span><span style="color: #66cc66;">)</span>;
<a href="http://www.php.net/echo"><span style="color: #000066;">echo</span></a> <span style="color: #ff0000;">"<br />Missing files are:"</span>;
<a href="http://www.php.net/print_r"><span style="color: #000066;">print_r</span></a><span style="color: #66cc66;">(</span><span style="color: #0000ff;">$difference</span><span style="color: #66cc66;">)</span>;
<span style="color: #808080; font-style: italic;">// any expected that we didn't find?</span>
<span style="color: #0000ff;">$difference</span> = <a href="http://www.php.net/array_diff"><span style="color: #000066;">array_diff</span></a><span style="color: #66cc66;">(</span><span style="color: #0000ff;">$files_expected</span>, <span style="color: #0000ff;">$files_there</span><span style="color: #66cc66;">)</span>;
<a href="http://www.php.net/echo"><span style="color: #000066;">echo</span></a> <span style="color: #ff0000;">"<br />Extra files are:"</span>;
<a href="http://www.php.net/print_r"><span style="color: #000066;">print_r</span></a><span style="color: #66cc66;">(</span><span style="color: #0000ff;">$difference</span><span style="color: #66cc66;">)</span>;</pre>
</div>
<p>最后,有个比较“恐怖”的函数 - delete_files()。删除指定目录里的所有文件:</p>
<div class="code">
<div class="title">
<div style="float:right"><img class="copyCodeImage" src="images/copycode.gif" alt="" /><a href="javascript:void(0)" onclick="CopyCode(this)">复制代码到剪贴板</a></div>
<div style="clear:none">PHP 代码</div>
</div>
<pre class="php">delete_files<span style="color: #66cc66;">(</span><span style="color: #ff0000;">'c:/mydirectory/'</span><span style="color: #66cc66;">)</span>;</pre>
</div>
<p>将删除“mydirectory”中的所有内容。如果你添加可选参数为“TRUE”:</p>
<div class="code">
<div class="title">
<div style="float:right"><img class="copyCodeImage" src="images/copycode.gif" alt="" /><a href="javascript:void(0)" onclick="CopyCode(this)">复制代码到剪贴板</a></div>
<div style="clear:none">PHP 代码</div>
</div>
<pre class="php">delete_files<span style="color: #66cc66;">(</span><span style="color: #ff0000;">'c:/mydirectory/'</span>, <span style="color: #000000; font-weight: bold;">TRUE</span><span style="color: #66cc66;">)</span>;</pre>
</div>
<p>这同时会删除目录下的所有子文件夹,多加小心。想象下面发生什么?</p>
<div class="code">
<div class="title">
<div style="float:right"><img class="copyCodeImage" src="images/copycode.gif" alt="" /><a href="javascript:void(0)" onclick="CopyCode(this)">复制代码到剪贴板</a></div>
<div style="clear:none">PHP 代码</div>
</div>
<pre class="php">delete_files<span style="color: #66cc66;">(</span><span style="color: #ff0000;">"c:/"</span>, <span style="color: #000000; font-weight: bold;">TRUE</span><span style="color: #66cc66;">)</span>;</pre>
</div>
<p>要不你试试?!</p>
<a name="C_11_2"></a>
<h2>11.2 下载辅助函数</h2>
<p>下载辅助函数库里只有一个函数,但他是文件辅助函数很好的补充。你可能创建了个文件,而希望将之以文本文件的方式展现给访问者,而非一个网页。</p>
<p>一个很好的例子是一个数据库备份文件,就像我们刚刚创建的那段代码。</p>
<p>为了在数据库崩溃的时候重建它,我们需要一个 MySQL 格式的文本文件。屏幕上的东西对我们来说没多大用处:</p>
<p><img src="images/CodeIgniter-16.gif" /></p>
<p>我们需要找到一种下载文件的方式。换句话说,在 Windows 系统中,我们想看到这个对话框:</p>
<p><img src="images/CodeIgniter-17.gif" /></p>
<p>为了在 Internet 连接下编码这些内容,你必须在 HTTP 头中指定页面类型。CI 的下载辅助函数帮助你在后台完成这些事情。装载辅助函数:</p>
<div class="code">
<div class="title">
<div style="float:right"><img class="copyCodeImage" src="images/copycode.gif" alt="" /><a href="javascript:void(0)" onclick="CopyCode(this)">复制代码到剪贴板</a></div>
<div style="clear:none">PHP 代码</div>
</div>
<pre class="php"><span style="color: #0000ff;">$this</span>-><span style="color: #006600;">load</span>-><span style="color: #006600;">helper</span><span style="color: #66cc66;">(</span><span style="color: #ff0000;">'download'</span><span style="color: #66cc66;">)</span>;</pre>
</div>
<p>像下面这样使用其唯一的方法:</p>
<div class="code">
<div class="title">
<div style="float:right"><img class="copyCodeImage" src="images/copycode.gif" alt="" /><a href="javascript:void(0)" onclick="CopyCode(this)">复制代码到剪贴板</a></div>
<div style="clear:none">PHP 代码</div>
</div>
<pre class="php">force_download<span style="color: #66cc66;">(</span><span style="color: #0000ff;">$name</span>, <span style="color: #0000ff;">$data</span><span style="color: #66cc66;">)</span>;</pre>
</div>
<p>$name 是被下载文件的名字,$data 是文件的内容。如果你想下载已存在的文件,那么你需要先把它读到字符串中:</p>
<div class="code">
<div class="title">
<div style="float:right"><img class="copyCodeImage" src="images/copycode.gif" alt="" /><a href="javascript:void(0)" onclick="CopyCode(this)">复制代码到剪贴板</a></div>
<div style="clear:none">PHP 代码</div>
</div>
<pre class="php"><span style="color: #0000ff;">$data</span> = <a href="http://www.php.net/file_get_contents"><span style="color: #000066;">file_get_contents</span></a><span style="color: #66cc66;">(</span><span style="color: #ff0000;">"e:/mybackup.txt"</span><span style="color: #66cc66;">)</span>;
<span style="color: #0000ff;">$name</span> = <span style="color: #ff0000;">'backup.txt'</span>;
force_download<span style="color: #66cc66;">(</span><span style="color: #0000ff;">$name</span>, <span style="color: #0000ff;">$data</span><span style="color: #66cc66;">)</span>;</pre>
</div>
<p>文件的内容可以直接重建 MySQL 数据库。你也可以使用这个辅助函数直接下载报告,无需强迫用户把他们从屏幕上摘抄下来。</p>
<p>在幕后,辅助函数帮助识别 MIME 类型并设置 HTTP 头。他依赖于其中的“配置”文件,system/application/config/mimes,下一节将看到上传类也使用它。这个配置文件存储 MIME 类型和对应 HTTP 扩展名的数组—例如:</p>
<div class="code">
<div class="title">
<div style="float:right"><img class="copyCodeImage" src="images/copycode.gif" alt="" /><a href="javascript:void(0)" onclick="CopyCode(this)">复制代码到剪贴板</a></div>
<div style="clear:none">PHP 代码</div>
</div>
<pre class="php"><span style="color: #ff0000;">'rtf'</span> => <span style="color: #ff0000;">'text/rtf'</span>,
<span style="color: #ff0000;">'text'</span> => <span style="color: #ff0000;">'text/plain'</span>,</pre>
</div>
<p>这个方法能节省你去记忆他们的时间!</p>
<p>如果你经常使用的文件类型没有包括在 CI 的列表中,那么你可以很容易的将它们添加到“配置”文件中。</p>
<a name="C_11_3"></a>
<h2>11.3 文件上传类</h2>
<p>有时候,你想允许用户在你的网站里上传文件。这些可能是文本、图像或更多其他文件类型,如 MP3 音频或 MPEG 视频。这是一个比我们刚刚讨论过的文件下载更复杂的过程,但 CI 的文件上传类可以帮你完成大多数的工作。它也能处理一些安全问题。不过,你应该总是三思而后行允许任何人上传文件到你的网站,你可能想要保护上传页面,以防止未经授权的用户上传。</p>
<p>首先,您需要在服务器上分配空间(文件夹),以存放上传的文件。这个文件夹必须已设置了正确的权限,以允许用户写入。(例如 Unix/Linux 系统上的 777)。让我们假设你新建一个名为“uploads”的文件夹,并将它放在 WEB 根目录文件夹中。</p>
<a name="I_loading"></a>
<p>装载 CI 的文件上传类:</p>
<div class="code">
<div class="title">
<div style="float:right"><img class="copyCodeImage" src="images/copycode.gif" alt="" /><a href="javascript:void(0)" onclick="CopyCode(this)">复制代码到剪贴板</a></div>
<div style="clear:none">PHP 代码</div>
</div>
<pre class="php"><span style="color: #0000ff;">$this</span>-><span style="color: #006600;">load</span>-><span style="color: #006600;">library</span><span style="color: #66cc66;">(</span><span style="color: #ff0000;">'upload'</span><span style="color: #66cc66;">)</span>;</pre>
</div>
<a name="I_working_of"></a>
<p>然后你需要做三件事情:</p>
<ul>
<li>设置默认值</li>
<li>创建一个控制器来处理上传。</li>
<li>给你的用户提供一个上传表单和“成功”表单。</li>
</ul>
<p>让我们按这个顺序设置他们。首先,设置一系列默认值。创建一个 $config 数组以完成这件事。</p>
<p>让我们将你刚创建的目录设置为上传目录。这样写:</p>
<div class="code">
<div class="title">
<div style="float:right"><img class="copyCodeImage" src="images/copycode.gif" alt="" /><a href="javascript:void(0)" onclick="CopyCode(this)">复制代码到剪贴板</a></div>
<div style="clear:none">PHP 代码</div>
</div>
<pre class="php"><span style="color: #0000ff;">$config</span><span style="color: #66cc66;">[</span><span style="color: #ff0000;">'upload_path'</span><span style="color: #66cc66;">]</span> = <span style="color: #ff0000;">'uploads'</span>;</pre>
</div>
<p>这行代码可以写在控制器中,也可以在 config 文件夹中创建一个包含这行代码的 upload.php 文件。(system/application/config/upload.php)。</p>
<div class="code">
<div class="title">
<div style="float:right"><img class="copyCodeImage" src="images/copycode.gif" alt="" /><a href="javascript:void(0)" onclick="CopyCode(this)">复制代码到剪贴板</a></div>
<div style="clear:none">PHP 代码</div>
</div>
<pre class="php"><span style="color: #000000; font-weight: bold;"><?php</span> <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">(</span>!<a href="http://www.php.net/defined"><span style="color: #000066;">defined</span></a><span style="color: #66cc66;">(</span><span style="color: #ff0000;">'BASEPATH'</span><span style="color: #66cc66;">)</span><span style="color: #66cc66;">)</span> <a href="http://www.php.net/exit"><span style="color: #000066;">exit</span></a><span style="color: #66cc66;">(</span><span style="color: #ff0000;">'No direct script access allowed'</span><span style="color: #66cc66;">)</span>;
<span style="color: #0000ff;">$config</span><span style="color: #66cc66;">[</span><span style="color: #ff0000;">'upload_path'</span><span style="color: #66cc66;">]</span> = <span style="color: #ff0000;">'uploads'</span>;
<span style="color: #000000; font-weight: bold;">?></span></pre>
</div>
<p>理解这两种设置默认值方式之间的区别很重要。如果你在 config/upload.php 文件中设置了默认值,你就不需要专门进行初始化文件上传类的工作。只要装载他,他自己就能找到默认值。</p>
<p>但是,你可以在加载类的时候在第二个参数中指定该控制器的默认值,像这样:</p>
<div class="code">
<div class="title">
<div style="float:right"><img class="copyCodeImage" src="images/copycode.gif" alt="" /><a href="javascript:void(0)" onclick="CopyCode(this)">复制代码到剪贴板</a></div>
<div style="clear:none">PHP 代码</div>
</div>
<pre class="php"><span style="color: #0000ff;">$this</span>-><span style="color: #006600;">load</span>-><span style="color: #006600;">library</span><span style="color: #66cc66;">(</span><span style="color: #ff0000;">'upload'</span>, <span style="color: #0000ff;">$config</span><span style="color: #66cc66;">)</span>;</pre>
</div>
<p>$config 是默认值数组的名字。(不要试图在 config/upload.php 文件和控制器里设置默认值!)</p>
<p>这种处理方式显得不够优雅,所以 CI 推荐使用更合理的方式组织配置文件。下面是几个要点:</p>
<ul>
<li>上传文件的位置:CI 不做任何假设,你必须告诉他。</li>
<li>允许用户上传的文件类型。像这样设置:
<div class="code">
<div class="title">
<div style="float:right"><img class="copyCodeImage" src="images/copycode.gif" alt="" /><a href="javascript:void(0)" onclick="CopyCode(this)">复制代码到剪贴板</a></div>
<div style="clear:none">PHP 代码</div>
</div>
<pre class="php"><span style="color: #0000ff;">$config</span><span style="color: #66cc66;">[</span><span style="color: #ff0000;">'allowed_types'</span><span style="color: #66cc66;">]</span> = <span style="color: #ff0000;">'gif|jpg|png'</span>;</pre>
</div>
使用管道操作符(|)分隔允许的文件类型。上面的设置将允许在你的网站里上传大多数的图像类型的文件,但他将不允许上传音频文件。设置这个参数是一个基本的安全措施:如果你只想让用户上传图片,而不允许上传可执行文件或大型 MP3 文件。<br />
注意:你必须在允许上传文件之前设置一个值:默认设置(例如:不设置)不允许上传任何文件。 </li>
<li>Max_size:如果你不想恶意用户填满你所有的空间,那就明确的设置可上传文件的最大文件大小(KB)。默认值是 0,表示没有限制。</li>
<li>覆盖:如果用户正在上传的文件,和上传文件夹里的文件同名的话,旧文件将被覆盖并永远丢失吗?这取决于网站的实现和允许用户上传的原因。CI 的默认值是“FALSE”, 意思是不覆盖旧文件,并用一个新名字保存文件。如果你想新文件覆盖旧文件,就明确设置这个默认值为“TRUE”。<br />
注意:CI 不会自动通知用户他或她的文件已被重命名,所以可能会让用户产生困惑:阅读下面的内容,来学习如何取得上传过程的报告。 </li>
<li>你还可以设置图片尺寸,宽和高的默认值;加密文件;清理标题上的空白。</li>
</ul>
<p>现在你已经确定默认设置了,接下来你需要一个上传控制器。这非常简单。他的作用是初始化上传类、从用户表单接收上传,然后确定上传是否成功。如果成功则显示一个报告;如果失败则返回一个带错误信息的上传表单。非常简单,他只包括一个方法:do_upload(),像这样:</p>
<div class="code">
<div class="title">
<div style="float:right"><img class="copyCodeImage" src="images/copycode.gif" alt="" /><a href="javascript:void(0)" onclick="CopyCode(this)">复制代码到剪贴板</a></div>
<div style="clear:none">PHP 代码</div>
</div>
<pre class="php"><span style="color: #000000; font-weight: bold;"><?php</span>
<span style="color: #808080; font-style: italic;">/*constructor function to initialize controller and load the file upload class,
plus the two other helpers it needs */</span>
<span style="color: #000000; font-weight: bold;">class</span> Upload <span style="color: #000000; font-weight: bold;">extends</span> Controller <span style="color: #66cc66;">{</span>
<span style="color: #000000; font-weight: bold;">function</span> Upload<span style="color: #66cc66;">(</span><span style="color: #66cc66;">)</span>
<span style="color: #66cc66;">{</span>
parent::<span style="color: #006600;">Controller</span><span style="color: #66cc66;">(</span><span style="color: #66cc66;">)</span>;
<span style="color: #0000ff;">$this</span>-><span style="color: #006600;">load</span>-><span style="color: #006600;">helper</span><span style="color: #66cc66;">(</span><a href="http://www.php.net/array"><span style="color: #000066;">array</span></a><span style="color: #66cc66;">(</span><span style="color: #ff0000;">'form'</span>, <span style="color: #ff0000;">'url'</span><span style="color: #66cc66;">)</span><span style="color: #66cc66;">)</span>;
<span style="color: #0000ff;">$this</span>-><span style="color: #006600;">load</span>-><span style="color: #006600;">library</span><span style="color: #66cc66;">(</span><span style="color: #ff0000;">'upload'</span><span style="color: #66cc66;">)</span>;
<span style="color: #66cc66;">}</span>
<span style="color: #808080; font-style: italic;">/*now the function which does all the work!*/</span>
<span style="color: #000000; font-weight: bold;">function</span> do_upload<span style="color: #66cc66;">(</span><span style="color: #66cc66;">)</span>
<span style="color: #66cc66;">{</span>
<span style="color: #b1b100;">if</span> <span style="color: #66cc66;">(</span> ! <span style="color: #0000ff;">$this</span>-><span style="color: #006600;">upload</span>-><span style="color: #006600;">do_upload</span><span style="color: #66cc66;">(</span><span style="color: #66cc66;">)</span><span style="color: #66cc66;">)</span>
<span style="color: #66cc66;">{</span>
<span style="color: #0000ff;">$error</span> = <a href="http://www.php.net/array"><span style="color: #000066;">array</span></a><span style="color: #66cc66;">(</span><span style="color: #ff0000;">'error'</span> => <span style="color: #0000ff;">$this</span>-><span style="color: #006600;">upload</span>-><span style="color: #006600;">display_errors</span><span style="color: #66cc66;">(</span><span style="color: #66cc66;">)</span><span style="color: #66cc66;">)</span>;
<span style="color: #0000ff;">$this</span>-><span style="color: #006600;">load</span>-><span style="color: #006600;">view</span><span style="color: #66cc66;">(</span><span style="color: #ff0000;">'upload_form'</span>, <span style="color: #0000ff;">$error</span><span style="color: #66cc66;">)</span>;
<span style="color: #66cc66;">}</span>
<span style="color: #b1b100;">else</span>
<span style="color: #66cc66;">{</span>
<span style="color: #0000ff;">$data</span> = <a href="http://www.php.net/array"><span style="color: #000066;">array</span></a><span style="color: #66cc66;">(</span><span style="color: #ff0000;">'upload_data'</span> => <span style="color: #0000ff;">$this</span>-><span style="color: #006600;">upload</span>-><span style="color: #006600;">data</span><span style="color: #66cc66;">(</span><span style="color: #66cc66;">)</span><span style="color: #66cc66;">)</span>;
<span style="color: #0000ff;">$this</span>-><span style="color: #006600;">load</span>-><span style="color: #006600;">view</span><span style="color: #66cc66;">(</span><span style="color: #ff0000;">'upload_success'</span>, <span style="color: #0000ff;">$data</span><span style="color: #66cc66;">)</span>;
<span style="color: #66cc66;">}</span>
<span style="color: #66cc66;">}</span>
<span style="color: #66cc66;">}</span></pre>
</div>
<p>此功能需要一个 upload_form 视图和 upload_success 视图。先使用表单辅助函数创建一个表单,并指向“upload”控制器的 do_upload 方法:不要用下面的函数“打开”:</p>
<div class="code">
<div class="title">
<div style="float:right"><img class="copyCodeImage" src="images/copycode.gif" alt="" /><a href="javascript:void(0)" onclick="CopyCode(this)">复制代码到剪贴板</a></div>
<div style="clear:none">PHP 代码</div>
</div>
<pre class="php"><a href="http://www.php.net/echo"><span style="color: #000066;">echo</span></a> form_open<span style="color: #66cc66;">(</span><span style="color: #ff0000;">'upload/do_upload'</span><span style="color: #66cc66;">)</span>;</pre>
</div>
<p>(第五章里介绍的表单“打开”方式),而是用表单辅助函数的 multipart 函数“打开”:</p>
<div class="code">
<div class="title">
<div style="float:right"><img class="copyCodeImage" src="images/copycode.gif" alt="" /><a href="javascript:void(0)" onclick="CopyCode(this)">复制代码到剪贴板</a></div>
<div style="clear:none">PHP 代码</div>
</div>
<pre class="php"><a href="http://www.php.net/echo"><span style="color: #000066;">echo</span></a> form_open_multipart<span style="color: #66cc66;">(</span><span style="color: #ff0000;">'upload/do_upload'</span><span style="color: #66cc66;">)</span>;</pre>
</div>
<p>(记住:我们是在用代码来产生 HTML 标签,所以需要显示到屏幕上。)</p>
<p>然后,使用表单辅助函数的 form_upload 函数替换 form_input:</p>
<div class="code">
<div class="title">
<div style="float:right"><img class="copyCodeImage" src="images/copycode.gif" alt="" /><a href="javascript:void(0)" onclick="CopyCode(this)">复制代码到剪贴板</a></div>
<div style="clear:none">PHP 代码</div>
</div>
<pre class="php"><a href="http://www.php.net/echo"><span style="color: #000066;">echo</span></a> form_upload<span style="color: #66cc66;">(</span><span style="color: #0000ff;">$data</span><span style="color: #66cc66;">)</span>;</pre>
</div>
<p>这两行代码可以帮你完成很多乏味的工作。</p>
<p>添加一个提交按钮,并“关闭”表单。</p>
<div class="code">
<div class="title">
<div style="float:right"><img class="copyCodeImage" src="images/copycode.gif" alt="" /><a href="javascript:void(0)" onclick="CopyCode(this)">复制代码到剪贴板</a></div>
<div style="clear:none">PHP 代码</div>
</div>
<pre class="php"><a href="http://www.php.net/echo"><span style="color: #000066;">echo</span></a> form_submit<span style="color: #66cc66;">(</span><span style="color: #ff0000;">'mysubmit'</span>, <span style="color: #ff0000;">'Submit Post!'</span><span style="color: #66cc66;">)</span>;</pre>
</div>
<p>传递 $view 变量到视图并装载他。当 do_upload 函数传递 $error 到视图中时,你的视图也应该显示 $error 变量。</p>
<div class="code">
<div class="title">
<div style="float:right"><img class="copyCodeImage" src="images/copycode.gif" alt="" /><a href="javascript:void(0)" onclick="CopyCode(this)">复制代码到剪贴板</a></div>
<div style="clear:none">PHP 代码</div>
</div>
<pre class="php"><a href="http://www.php.net/echo"><span style="color: #000066;">echo</span></a> <span style="color: #0000ff;">$error</span>;</pre>
</div>
<p>你现在看到的页面应该是这样的:</p>
<p><img src="images/CodeIgniter-18.gif" /></p>
<p>单击“浏览”查看用户电脑上的文件(本地),而不是服务器上的。一旦他(她)选择了一个文件并单击上传按钮,将调用上传控制器,然后文件将被传输到服务器上的上传文件夹中。</p>
<p>当我们尝试上传一个文本文件时,(记住,我们只允许“gif | jpg | png”文件类型。)我们将看到:</p>
<p><img src="images/CodeIgniter-19.gif" /></p>
<p>CI 返回一个类型错误:这是控制器中的 $this->upload->display_errors() 方法在起作用,他在视图中添加了一个错误消息变量。</p>
<p>你也可以让 CI 报告上传已成功。正如你看到的,如果上传成功,控制器就装载一个名为 upload_success 的视图。$this->upload->data 方法的内容将被传递到这个视图中。他返回上传过程的所有信息的数组:可能多于你想要显示的信息。</p>
<p>我上传一个名为 waltzer.jpg 的文件:默认报告看起来是这样的:</p>
<p><img src="images/CodeIgniter-20.gif" /></p>
<p>如果你想创建一个像 Flickr 那样的站点的话,那这些信息可能会影响用户上传他们的图片!然而,你可以很容易的去掉上传控制器中你不需要的任何信息。</p>
<p>请注意,顺便说一下,在写这个例子的时候,我设置文件上传类的“overwrite”值为“FALSE”,然后上传了两次 waltzer.jpg 文件。</p>
<p>上面的截图显示的是 CI 关于第二次上传成功的报告。你将看到文件已被重命名为 waltzer1.jpg。如果查看上传文件夹,你就会看到两个文件,一个是原来的 waltzer.jpg 文件,另一个是新的 waltzer1.jpg 文件。在你的应用里,你可能想比较 raw_name 和 orig_name 的值,并告诉用户文件名已被更改。</p>
<p>CI 不比较两个文件的内容,只比较文件名。如果你允许多人上传文件,那么,其中的两个人,将很有可能在无意中,使用相同的文件名来上传不同的文件,并且,你可能不希望丢失第一个文件。另一方面,如果你通过网站上传名字总是相同的文件,你也许宁愿只在网站上保存最新的文件,在这种情况下,覆盖文件是一个简单的节省空间的方法。</p>
<p>顺便说一下这个图片,我们将在下一节用到它。</p>
<p><img src="images/CodeIgniter-21.jpg" /></p>
<a name="C_11_4"></a>
<h2>11.4 CI 的图像类</h2>
<p>如果你允许用户上传图片,你还需要看看 CI 的图像处理类。他支持 PHP 最流行的三个图像类库:GD/GD2、NetPBM 和 ImageMagick。(使用 phpinfo() 查看你的服务器是否支持这些类库。)虽然图像水印效果只支持 GD/GD2:</p>
<a name="I_crop_fucntions"></a>
<a name="I_fucntions"></a>
<a name="I_resize_fucntions"></a>
<a name="I_resizing"></a>
<a name="I_rotate_fucntions"></a>
<a name="I_watermark_fucntions"></a>
<p>图像处理类允许你完成图像的 4 个基本功能:</p>
<ul>
<li>缩放:在你的屏幕上,你可能想把它们的大小设置为标准尺寸;或者你想设置成“缩略图”的大小。</li>
<li>裁剪</li>
<li>旋转</li>
<li>水印(只可用在 GD/GD2):它经常用于在图片上放置版权标志,这样可以防止别人从你的网站上下载图片,然后占为己有,当作他们自己的原创作品。</li>
</ul>
<p>这些功能中最有用的可能就是缩放了,那么一会儿我们来详细看看吧。裁剪和旋转用处不大,除非你能在屏幕上看到图片。要做到这一点,你需要某种形式的用户界面,使用户可以指定她或他想做的事,并控制 CI 实现这些功能,并且,你需要自己编写这些功能代码!</p>
<p>让我们假设你已经使用刚才讨论过的文件上传类,上传了 wltzer.jpg 图片到 /uploads 文件夹中。(上传和处理图片需要设置这个文件夹的权限为 777,因为 CI 需要保存处理结果到这个文件夹中。)</p>
<p>首先, 装载类库:</p>
<div class="code">
<div class="title">
<div style="float:right"><img class="copyCodeImage" src="images/copycode.gif" alt="" /><a href="javascript:void(0)" onclick="CopyCode(this)">复制代码到剪贴板</a></div>
<div style="clear:none">PHP 代码</div>
</div>
<pre class="php"><span style="color: #0000ff;">$this</span>-><span style="color: #006600;">load</span>-><span style="color: #006600;">library</span><span style="color: #66cc66;">(</span><span style="color: #ff0000;">'image_lib'</span><span style="color: #66cc66;">)</span>;</pre>
</div>
<p>然后,你需要设置几个配置信息。(与文件上传类一样,你可以写在代码里,也可以放到单独的 system/application/config/image_lib.php 文件中。)</p>
<p>这里有一些配置,并且他们已列在《用户指南》里了。或许最重要的是:</p>
<ul>
<li>选择你使用的图像库。默认是 GD2,所以,如果你的 PHP 安装的不是这个库的话,你需要指定一个,例如,$config['image_library'] = 'ImageMagick';(你也应该提供 ImageMagick 库的路径:$config['library_path'] = '/mypath';)</li>
<li>你要处理的图片。应该提供路径(相对于网站根目录)和文件名。</li>
<li>处理后图片的尺寸—“x”表示像素数,设置宽度:$config['width'] = x;,设置高度 $config['height'] = x;。</li>
</ul>
<p>要调整图片尺寸,只这些还不够,需要用已调整尺寸的图片覆盖旧图片文件。代码如下:</p>
<div class="code">
<div class="title">
<div style="float:right"><img class="copyCodeImage" src="images/copycode.gif" alt="" /><a href="javascript:void(0)" onclick="CopyCode(this)">复制代码到剪贴板</a></div>
<div style="clear:none">PHP 代码</div>
</div>
<pre class="php"><span style="color: #000000; font-weight: bold;">function</span> do_image<span style="color: #66cc66;">(</span><span style="color: #0000ff;">$image_name</span><span style="color: #66cc66;">)</span>
<span style="color: #66cc66;">{</span>
<span style="color: #0000ff;">$this</span>-><span style="color: #006600;">load</span>-><span style="color: #006600;">library</span><span style="color: #66cc66;">(</span><span style="color: #ff0000;">'image_lib'</span><span style="color: #66cc66;">)</span>;
<span style="color: #0000ff;">$config</span><span style="color: #66cc66;">[</span><span style="color: #ff0000;">'image_library'</span><span style="color: #66cc66;">]</span> = <span style="color: #ff0000;">'GD2'</span>;
<span style="color: #0000ff;">$config</span><span style="color: #66cc66;">[</span><span style="color: #ff0000;">'source_image'</span><span style="color: #66cc66;">]</span> = <span style="color: #ff0000;">"$image_name"</span>;
<span style="color: #0000ff;">$config</span><span style="color: #66cc66;">[</span><span style="color: #ff0000;">'width'</span><span style="color: #66cc66;">]</span> = <span style="color: #cc66cc;">140</span>;
<span style="color: #0000ff;">$config</span><span style="color: #66cc66;">[</span><span style="color: #ff0000;">'height'</span><span style="color: #66cc66;">]</span> = <span style="color: #cc66cc;">104</span>;
<span style="color: #0000ff;">$this</span>-><span style="color: #006600;">image_lib</span>-><span style="color: #006600;">initialize</span><span style="color: #66cc66;">(</span><span style="color: #0000ff;">$config</span><span style="color: #66cc66;">)</span>;
<span style="color: #b1b100;">if</span><span style="color: #66cc66;">(</span>!<span style="color: #0000ff;">$this</span>-><span style="color: #006600;">image_lib</span>-><span style="color: #006600;">resize</span><span style="color: #66cc66;">(</span><span style="color: #66cc66;">)</span><span style="color: #66cc66;">)</span>
<span style="color: #66cc66;">{</span><a href="http://www.php.net/echo"><span style="color: #000066;">echo</span></a> <span style="color: #ff0000;">"failed"</span>;<span style="color: #66cc66;">}</span>
<span style="color: #b1b100;">else</span><span style="color: #66cc66;">{</span><a href="http://www.php.net/echo"><span style="color: #000066;">echo</span></a> <span style="color: #ff0000;">'success!'</span>;<span style="color: #66cc66;">}</span>
<span style="color: #66cc66;">}</span></pre>
</div>
<p>这个库可以做其他一些聪明的事情。如果你不想覆盖原始图片,可以为新版本指定新名称和文件路径,添加:</p>
<div class="code">
<div class="title">
<div style="float:right"><img class="copyCodeImage" src="images/copycode.gif" alt="" /><a href="javascript:void(0)" onclick="CopyCode(this)">复制代码到剪贴板</a></div>
<div style="clear:none">PHP 代码</div>
</div>
<pre class="php"><span style="color: #0000ff;">$config</span><span style="color: #66cc66;">[</span><span style="color: #ff0000;">'new_image'</span><span style="color: #66cc66;">]</span> = <span style="color: #ff0000;">'newfolder/newname.png'</span>;</pre>
</div>
<p>或者,如果你想创建一个图片的缩略图,简单地添加:</p>
<div class="code">
<div class="title">
<div style="float:right"><img class="copyCodeImage" src="images/copycode.gif" alt="" /><a href="javascript:void(0)" onclick="CopyCode(this)">复制代码到剪贴板</a></div>
<div style="clear:none">PHP 代码</div>
</div>
<pre class="php"><span style="color: #0000ff;">$config</span><span style="color: #66cc66;">[</span><span style="color: #ff0000;">'create_thumb'</span><span style="color: #66cc66;">]</span> = <span style="color: #000000; font-weight: bold;">TRUE</span>;</pre>
</div>
<p>执行的效果是:用默认的后缀(_thumb)重命名新调整的文件,把 waltzer.jpg 改成 waltzer_thumb.jpg。(你可以很容易的修改后缀--参考《用户指南》。) 所以,现在有两个文件在同一个文件夹中:原图和缩略图。</p>
<p>注意:缩略图设置什么也不做,你还是需要设置你想要的尺寸。</p>
<p>这个图片被缩小到 140x104 像素:</p>
<p><img src="images/CodeIgniter-22.jpg" /></p>
<p>图像类的附加功能可以给你的图片加水印。所以,如果你把自己的精彩照片放到网站上,你也可以添加一个版权声明。</p>
<p>虽然添加水印功能有很多选项,在《用户指南》里有详细说明,但基本的代码很简单。初始化类,告诉它想要加水印的图片和水印的内容,然后调用 watermark 方法。</p>
<div class="code">
<div class="title">
<div style="float:right"><img class="copyCodeImage" src="images/copycode.gif" alt="" /><a href="javascript:void(0)" onclick="CopyCode(this)">复制代码到剪贴板</a></div>
<div style="clear:none">PHP 代码</div>
</div>
<pre class="php"><span style="color: #000000; font-weight: bold;">function</span> wm_image<span style="color: #66cc66;">(</span><span style="color: #66cc66;">)</span>
<span style="color: #66cc66;">{</span>
<span style="color: #0000ff;">$this</span>-><span style="color: #006600;">load</span>-><span style="color: #006600;">library</span><span style="color: #66cc66;">(</span><span style="color: #ff0000;">'image_lib'</span><span style="color: #66cc66;">)</span>;
<span style="color: #0000ff;">$config</span><span style="color: #66cc66;">[</span><span style="color: #ff0000;">'source_image'</span><span style="color: #66cc66;">]</span> = <span style="color: #ff0000;">'uploads/waltzer.jpg'</span>;
<span style="color: #0000ff;">$config</span><span style="color: #66cc66;">[</span><span style="color: #ff0000;">'wm_text'</span><span style="color: #66cc66;">]</span> = <span style="color: #ff0000;">'Copyright 2007 - David Upton'</span>;
<span style="color: #0000ff;">$config</span><span style="color: #66cc66;">[</span><span style="color: #ff0000;">'wm_type'</span><span style="color: #66cc66;">]</span> = <span style="color: #ff0000;">'text'</span>;
<span style="color: #0000ff;">$this</span>-><span style="color: #006600;">image_lib</span>-><span style="color: #006600;">initialize</span><span style="color: #66cc66;">(</span><span style="color: #0000ff;">$config</span><span style="color: #66cc66;">)</span>;
<span style="color: #b1b100;">if</span><span style="color: #66cc66;">(</span>!<span style="color: #0000ff;">$this</span>-><span style="color: #006600;">image_lib</span>-><span style="color: #006600;">watermark</span><span style="color: #66cc66;">(</span><span style="color: #66cc66;">)</span><span style="color: #66cc66;">)</span>
<span style="color: #66cc66;">{</span><a href="http://www.php.net/echo"><span style="color: #000066;">echo</span></a> <span style="color: #ff0000;">'failure to watermark'</span>;<span style="color: #66cc66;">}</span>
<span style="color: #b1b100;">else</span> <span style="color: #66cc66;">{</span><a href="http://www.php.net/echo"><span style="color: #000066;">echo</span></a> <span style="color: #ff0000;">'success'</span>;<span style="color: #66cc66;">}</span>
<span style="color: #66cc66;">}</span></pre>
</div>
<p>(wm_type 选项设置为 text,则允许你添加文本水印。否则,设置这个选项为 overlay,并提供一个叠加在你原图上的图片。)</p>
<p>现在图片看起来像这样。</p>
<p><img src="images/CodeIgniter-23.jpg" /></p>
<p>我的实际代码比上面的例子复杂的多,以便让我能控制大小和水印的位置,使之更清楚的显示在这个页面上。默认的代码如上所示,将足以应付大多数的用途,但水印太小,打印出来后无法看清。要了解更多关于使用外部字体的信息,请参考 CI 的《用户指南》。</p>
<p>这个类使用起来非常的简单。只有当你查看类的代码(在 system/libraries/Image_lib.php 文件中)后,才能体会到 CI 帮你节省了多少时间!</p>
<a name="C_11_5"></a>
<h2>11.5 用 CI Zip 类压缩文件很容易</h2>
<p>如果你要移动像图片这样的大文件的话,你可能需要压缩它们。CI 包含一个实现这个功能的,并且便于使用的类库。</p>
<p>让我们拿出刚用过的照片:waltzer.jpg。它在我们的 /uploads 文件夹中。</p>
<p>与以往一样,你要先初始化 Zip 类。然后,你要告诉 CI 你想压缩成什么文件,并创建要压缩的文件。接下来,使用 read_file 方法读取这些文件并压缩它,最后用 download 方法下载到你的桌面上。</p>
<div class="code">
<div class="title">
<div style="float:right"><img class="copyCodeImage" src="images/copycode.gif" alt="" /><a href="javascript:void(0)" onclick="CopyCode(this)">复制代码到剪贴板</a></div>
<div style="clear:none">PHP 代码</div>
</div>
<pre class="php"><span style="color: #000000; font-weight: bold;">function</span> zip_image<span style="color: #66cc66;">(</span><span style="color: #66cc66;">)</span>
<span style="color: #66cc66;">{</span>
<span style="color: #0000ff;">$this</span>-><span style="color: #006600;">load</span>-><span style="color: #006600;">library</span><span style="color: #66cc66;">(</span><span style="color: #ff0000;">'zip'</span><span style="color: #66cc66;">)</span>;
<span style="color: #0000ff;">$this</span>-><span style="color: #006600;">zip</span>-><span style="color: #006600;">archive</span><span style="color: #66cc66;">(</span><span style="color: #ff0000;">'my_backup.zip'</span><span style="color: #66cc66;">)</span>;
<span style="color: #0000ff;">$path</span> = <span style="color: #ff0000;">'uploads/waltzer1.jpg'</span>;
<span style="color: #0000ff;">$this</span>-><span style="color: #006600;">zip</span>-><span style="color: #006600;">read_file</span><span style="color: #66cc66;">(</span><span style="color: #0000ff;">$path</span><span style="color: #66cc66;">)</span>;
<span style="color: #0000ff;">$this</span>-><span style="color: #006600;">zip</span>-><span style="color: #006600;">download</span><span style="color: #66cc66;">(</span><span style="color: #ff0000;">'my_backup.zip'</span><span style="color: #66cc66;">)</span>;
<span style="color: #66cc66;">}</span></pre>
</div>
<p>CI Zip 编码类比上面说的更复杂,并有数个选项。一如以往,他们都刊载于《用户指南》中。但也应该给了你一个怎样用 CI 简单制作 zip 文件,并从网站上下载它的例子,以便尽量减少带宽消耗并为你的用户节省时间。</p>
<a name="C_11_6"></a>
<h2>11.6 总结</h2>
<p>本章集中说明了一些 CI 辅助函数和类库的功能,他们可以提供:</p>
<ul>
<li>使用最少的代码进行文件读写操作,并且可以自动处理锁定和解锁文件。</li>
<li>自动处理 HTTP 头,而不用关心如何处理是否要显示页面或者下载文件。</li>
<li>上传文件到服务器,并进行一些安全上的设置,比如说上传文件的尺寸和类型。</li>
<li>更方便的图片处理,如缩放和添加水印。</li>
<li>处理下载请求前先对文件进行压缩以节省带宽。</li>
</ul>
<p>对我来说框架就是这样,代替你完成许多乏味的编码工作,他会给你一个标准且易用的接口,并且为你考虑细节问题。</p>
</div>
</div>
<a name="bottom"></a>
<div id="footer">
<div class="title"><a href="10.html">上一页</a> | <a href="12.html">下一页</a> | <a href="table_of_contents.html">目录</a> | <a href="#top">转到页首</a></div>
<div style="clear:none">第十一章 使用 CI 处理文件和图片</div>
</div>
</div>
</body>
</html>