仓酷云

标题: PHP网页编程之让你同时上传 1000 个文件 [打印本页]

作者: 若相依    时间: 2015-2-16 00:27
标题: PHP网页编程之让你同时上传 1000 个文件
然后大吼:别人可以,我为什么就不可以?(是不是有点阎罗教练的味道,默默的确是电影看多了,抽嘴巴是会痛的,各位其实明白这个道理了就行了)上传   准备常识:Javascript, PHP(大批)/Perl(大批)!
测试情况:Windows2000 + IIS5 + PHP (Win98 + PWS + PHP3 掉败,估量是设置装备摆设出了成绩)
目次布局:
/wwwroot/cgi-bin/fileup.php (文件吸收)
/wwwroot/www/test/phpfileup.htm (文件提交)
/wwwroot/www/test/tmp/ (默许保留目次)

媒介:文件上传,复杂又费事。上面是上传文件的提交页面,使用该页面你不但可以生成 1000 个上传文件框(实践是恣意多个 0~n ),并且可分离指出它们的保留途径。
提交页面的文件输出框为定名为: file0,file1,...file100,...fileN
提交页面的文件途径框为定名为: path0,path1,...path100,...pathN
因为页面的生成十分复杂,所以就不在此多注释了,用 javascript 界说了两个函数,check() 用于提交页面,create()用于生成文件上传框。假如你有甚么更好的建议或有甚么疑问请 Email: gearsoft@netease.com

phpfileup.htm
--------------------------------------------------------
<html>
<head>
<title></title>
<style>
.lbtn {font-family:verdana;font-size:10.5pt;}
.ist {font-family:verdana;font-size:14.8px;size:400}
</style>

<script LANGUAGE="javascript">
function check(){
document.frm1.submit();
document.body.innerHTML="Uploading Please wait!";
}

var i=0;
function create(){
var sfrm = document.frm1.innerHTML;
var icnt = cnt.value;
for(j=0;j<icnt;j++)
{
sfrm = sfrm + "请选择文件 "+i+" <input type=file name='file"+i+"' class=ist>";
sfrm = sfrm + " 途径:<input type=text name='path"+i+"' value='../www/test/tmp/' class=ist>";
sfrm = sfrm + "<br>";
i++;
}
document.frm1.innerHTML = sfrm;
document.frm1.cnt.value=i;
}

</script>
</head>
<body class=lbtn >
请输出要上传文件的数目: <input type=text name=cnt value="10" class=ist >
<input type=button name=bt1 value="生成上传文件框" class=lbtn>
<input type=button name=bt1 value="上传" class=lbtn>
<input type=button name=bt1 value="排除" class=lbtn>

<form name=frm1 method="post" Enctype="multipart/form-data" action="../../cgi-bin/fileup.php">
<input type=hidden name=cnt value="20" class=ist>
</form>

<input type=button name=bt1 value="上传" class=lbtn>
<input type=button name=bt1 value="排除" class=lbtn>
</body>
</html>
文件提交页面既已生成,上面义务就很明白了:将提交的文件内容保留到办事器上。


上面咱们用两种办法来完成这个功效:
1. 用 PHP 来保留:
咱们先界说一个文件保留函数 fup() 它有两个参数:
$filename: 文件内容
$fname: 文件名(包括途径)
剩下的就是写一个轮回将文件顺次写入办事器。这里要复杂申明一下:
PHP 关于上传文件的处置是如许的:假如提交的文件框我为 file0, 那末提交给 PHP 的文件内容保留在变量 $file0 中,而文件名则保留在 $file0_name 中。如许在这个轮回中我要做的就是将提交页面提交的内容分化出来,完成进程请看上面的代码。

fileup.php
----------------------------------------------------------------------
<?
function fup($filename,$fname)
{ If($filename != "none") {
copy($filename,$fname);
unlink($filename);
}
}

for($i=0;$i<$cnt;$i++)
{
$ffnn="file".$i;
$ffnnname=$ffnn."_name";
$ffpath="path".$i;

//print $$ffnn;
print $$ffnnname;
print "<br>";

fup($$ffnn,$$ffpath.$$ffnnname); //"../www/test/tmp/"
}
?>
----------------------------------------------------------------------

2. 用 PERL 来保留:
它们完成的道理完整一样,在此不多说,请看代码:

fileup.cgi(fileup.pl)
----------------------------------------------------------------------
#!/usr/bin/perl

use CGI qw/:standard/;
if ($ENV{'CONTENT_TYPE'} !~ /multipart/form-data/) {
print "Cache-Control: no-cachenPragma: no-cachen" .
"Content-Type: text/htmlnn" .
"<html><body>Your web browser cannot upload files. Sorry.</body></html>";
exit 0;
}


$cntfile=param('cnt');
print header;
print start_html;
#print "Receiving Please wait....";
&g_head;
#$writed = '../www/test/tmp/';
for ($i=0;$i<$cntfile;$i++){
$paramfile = 'file'.$i;
$parampath='path'.$i;
$writed=param($parampath);
&upfile;
&g_body;
}
&g_bott;
#<<<<<<<<<<<<<<<<<<<<<以下为自界说进程<<<<<<<<<<<<<<<<<<<<<<<<<
sub upfile
{
$maxdata = 512000;
# $writed = '../www/test/tmp/';

$strRFname=reverse $xfile;
$intIndex=index($strRFname,'\');
$strNetFname=substr($strRFname,0,$intIndex);
$strNetFname=scalar reverse $strNetFname;

if((stat $xfile)[7]>$maxdata){
print "Status: 411 Size Not Allowedn" .
"Content-Type: text/htmlnAllow: POSTnn" .
"<html><head><title>411 411 Size Not Allowed</title></head><body><h1> You got big problem. Try again.</h1></body></html>n";
exit 0;
} binmode $xfile;
use File::Copy;
copy($xfile,$writed.$strNetFname);
}
sub g_head{
print '<table border=1 align=center>';
print '<tr><td colspan=3 align=center>文件上传了局(Upload Result)</td></tr>';
print '<tr align=center>';
print ' <td>SourceFile:</td>';
print ' <td>DestFile:</td>';
print ' <td>Upload</td>';
print '</tr>';
}
sub g_body{
print '<tr>';
print ' <td>'.$xfile .'</td>';
print ' <td>'.$writed.$strNetFname.'</td>';
print ' <td>OK!</td>';
print '</tr>';
}
sub g_bott{
print '</table>';
}

通过这段时间的学习实践,对软件开发有了更多新的认识,不在局限于之前的片面性。当然,现在所学到的东西其实并不多,离当一个真正的程序员,还有很大的差距。
作者: 老尸    时间: 2015-2-16 03:00
首先我是坚决反对新手上来就用框架的,因为对底层的东西一点都不了解,造成知识上的真空,会对以后的发展不利。我的观点上手了解下框架就好,代码还是手写。当然啦如果是位别的编程语言的高手的话,这个就另当别论啦。
作者: 蒙在股里    时间: 2015-2-22 20:31
基础有没有对学习php没有太大区别,关键是兴趣。
作者: 莫相离    时间: 2015-3-6 05:18
使用zendstdio 写代码的的时候,把tab 的缩进设置成4个空格是很有必要的
作者: 金色的骷髅    时间: 2015-3-7 19:05
实践是检验自己会不会的真理。
作者: 透明    时间: 2015-3-8 01:40
其实没啥难的,多练习,练习写程序,真正的实践比看100遍都有用。不过要熟悉引擎
作者: 简单生活    时间: 2015-3-15 18:26
真正的方向了,如果将来要去开发团队,你一定要学好smarty ,phplib这样的模板引擎,
作者: admin    时间: 2015-3-17 06:38
环境搭建好,当你看见你的浏览器输出“it works\\\\\\\"时你一定是喜悦的。在你解决问题的时候,我强烈建议多读php手册。
作者: 精灵巫婆    时间: 2015-3-18 14:43
装在C盘下面可以利用windows的ghost功能可以还原回来(顺便当做是重转啦),当然啦我的编译目录要放在别的盘下,不然自己的劳动成果就悲剧啦。
作者: 深爱那片海    时间: 2015-3-25 23:48
个人呢觉得,配wamp 最容易漏的一步就是忘了把$PHP$目录下的libmysql.dll拷贝到windows系统目录的system32目录下,还有重启apache。
作者: 再见西城    时间: 2015-3-30 13:54
遇到出错的时候,我经常把错误信息直接复制到 google的搜索栏,一般情况都是能搜到结果的,不过有时候会搜出来一大片英文的出来,这时候就得过滤一下,吧中文的弄出来,挨着式方法。
作者: 活着的死人    时间: 2015-3-31 05:17
,熟悉html,能用div+css,还有javascript,优先考虑linux。我在开始学习的时候,就想把这些知识一起学习,我天真的认为同时学习能够互相呼应,因为知识是相通的。
作者: 飘灵儿    时间: 2015-4-4 19:40
首推的搜索引擎当然是Google大神,其次我比较喜欢 百度知道。不过搜出来的结果往往都是 大家copy来copy去的,运气的的概率很大。
作者: 只想知道    时间: 2015-4-8 14:57
找到的的资料很多都是在论坛里的,需要注册,所以我一般没到一个论坛都注册一个id,所有的id都注册成一样的,这样下次再进来的时候就不用重复注册啦。当然有些论坛的某些资料是需要的付费的。
作者: 柔情似水    时间: 2015-4-15 20:08
有时候汉字的空格也能导致页面出错,所以在写代码的时候,要输入空格最好用引文模式。
作者: 再现理想    时间: 2015-4-26 09:11
微软最近出的新字体“微软雅黑”,虽然是挺漂亮的,不过firefox  支持的不是很好,所以能少用还是少用的好。
作者: 不帅    时间: 2015-4-26 12:58
没接触过框架的人,也不用害怕,其实框架就是一种命名规范及插件,学会一个框架其余的框架都很好上手的。
作者: 小妖女    时间: 2015-4-27 22:44
建数据库表的时候,int型要输入长度的,其实是个摆设的输入几位都没影响的,只要大于4就行,囧。
作者: 爱飞    时间: 2015-5-9 05:30
曾经犯过一个很低级的错误,我在文件命名的时候用了一个横线\\\\\\\'-\\\\\\\' 号,结果找了好几个小时的错误,事实是命名的时候 是不能用横线 \\\\\\\'-\\\\\\\' 的,应该用的是下划线  \\\\\\\'_\\\\\\\' ;
作者: 愤怒的大鸟    时间: 2015-6-12 06:58
Apache不是非得用80或者8080端口的,我刚开始安得时候就是80端口老占用,就用了个 81端口,结果照常,就是输localhost的时候,应该输入为 localhost:81
作者: 小女巫    时间: 2015-7-7 05:11
我还是推荐用firefox ,配上firebug 插件调试js能省下不受时间。谷歌的浏览器最好也不少用,因为谷歌的大侠们实在是太天才啦,把一些原来的js代码加了一些特效。




欢迎光临 仓酷云 (http://ckuyun.com/) Powered by Discuz! X3.2