若相依 发表于 2015-2-16 00:27:07

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)>$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:49

首先我是坚决反对新手上来就用框架的,因为对底层的东西一点都不了解,造成知识上的真空,会对以后的发展不利。我的观点上手了解下框架就好,代码还是手写。当然啦如果是位别的编程语言的高手的话,这个就另当别论啦。

蒙在股里 发表于 2015-2-22 20:31:40

基础有没有对学习php没有太大区别,关键是兴趣。

莫相离 发表于 2015-3-6 05:18:59

使用zendstdio 写代码的的时候,把tab 的缩进设置成4个空格是很有必要的

金色的骷髅 发表于 2015-3-7 19:05:45

实践是检验自己会不会的真理。

透明 发表于 2015-3-8 01:40:22

其实没啥难的,多练习,练习写程序,真正的实践比看100遍都有用。不过要熟悉引擎

简单生活 发表于 2015-3-15 18:26:03

真正的方向了,如果将来要去开发团队,你一定要学好smarty ,phplib这样的模板引擎,

admin 发表于 2015-3-17 06:38:31

环境搭建好,当你看见你的浏览器输出“it works\\\\\\\"时你一定是喜悦的。在你解决问题的时候,我强烈建议多读php手册。

精灵巫婆 发表于 2015-3-18 14:43:37

装在C盘下面可以利用windows的ghost功能可以还原回来(顺便当做是重转啦),当然啦我的编译目录要放在别的盘下,不然自己的劳动成果就悲剧啦。

深爱那片海 发表于 2015-3-25 23:48:08

个人呢觉得,配wamp 最容易漏的一步就是忘了把$PHP$目录下的libmysql.dll拷贝到windows系统目录的system32目录下,还有重启apache。

再见西城 发表于 2015-3-30 13:54:48

遇到出错的时候,我经常把错误信息直接复制到 google的搜索栏,一般情况都是能搜到结果的,不过有时候会搜出来一大片英文的出来,这时候就得过滤一下,吧中文的弄出来,挨着式方法。

活着的死人 发表于 2015-3-31 05:17:44

,熟悉html,能用div+css,还有javascript,优先考虑linux。我在开始学习的时候,就想把这些知识一起学习,我天真的认为同时学习能够互相呼应,因为知识是相通的。

飘灵儿 发表于 2015-4-4 19:40:20

首推的搜索引擎当然是Google大神,其次我比较喜欢 百度知道。不过搜出来的结果往往都是 大家copy来copy去的,运气的的概率很大。

只想知道 发表于 2015-4-8 14:57:04

找到的的资料很多都是在论坛里的,需要注册,所以我一般没到一个论坛都注册一个id,所有的id都注册成一样的,这样下次再进来的时候就不用重复注册啦。当然有些论坛的某些资料是需要的付费的。

柔情似水 发表于 2015-4-15 20:08:24

有时候汉字的空格也能导致页面出错,所以在写代码的时候,要输入空格最好用引文模式。

再现理想 发表于 2015-4-26 09:11:33

微软最近出的新字体“微软雅黑”,虽然是挺漂亮的,不过firefox支持的不是很好,所以能少用还是少用的好。

不帅 发表于 2015-4-26 12:58:43

没接触过框架的人,也不用害怕,其实框架就是一种命名规范及插件,学会一个框架其余的框架都很好上手的。

小妖女 发表于 2015-4-27 22:44:35

建数据库表的时候,int型要输入长度的,其实是个摆设的输入几位都没影响的,只要大于4就行,囧。

爱飞 发表于 2015-5-9 05:30:43

曾经犯过一个很低级的错误,我在文件命名的时候用了一个横线\\\\\\\'-\\\\\\\' 号,结果找了好几个小时的错误,事实是命名的时候 是不能用横线 \\\\\\\'-\\\\\\\' 的,应该用的是下划线\\\\\\\'_\\\\\\\' ;

愤怒的大鸟 发表于 2015-6-12 06:58:46

Apache不是非得用80或者8080端口的,我刚开始安得时候就是80端口老占用,就用了个 81端口,结果照常,就是输localhost的时候,应该输入为 localhost:81
页: [1] 2
查看完整版本: PHP网页编程之让你同时上传 1000 个文件