PHP的AJAX技术实现文件异步上传

作者:华红狼 正文:
上文中曾涉嫌了PHP提交表单消息是很有益于的。然而,提交的表单音讯中的变量的生命周期是多少长度呢?本文就来谈谈那一个标题。
表单的参数会传给下贰个管理程序,那是决不置疑的。因为,大家曾有过这样的事例。可它还或然会一而再传给下三个处理程序吗?
答案是还是不是定的!一个Form表单所付出的参数只传给第二个管理程序,而下三个管理程序中它是不会起效果的。来探望下例吧:
文件:table.html html headtitle表单提交/title /head body form
action=deal-1.php 输入你感到好的歌唱家:input type=text name=start size=20
input type=submit value=是她了,送出吧 /form /body /html
文件:deal-1.php ?php echo htmlbody; echo 你喜爱$start,对吗?br; echo a
href=/deal-2.php/试试是还是不是会再传下去/a; echo /body/html; ?
文件:deal-2.php ?php echo htmlbody; echo 你说$start行吗?; echo
/body/html; ? 从上例中,大家得以看到:deal-1.php管理的结果为:
你欢喜张学友先生,对啊? 试试是还是不是会再传下去
表明表单提交了变量$start给deal-1.php,而在deal-1.php的显得结果中,若大家点击了链接“试试是或不是会再传下去”之后,deal-2.php的管理结果为:
你说行吗?
很分明,$start未有传给deal-2.php。然而,我们又怎么延长$start的生命周期呢?其实,那非常粗大略,使用参数字传送递的诀要就能够了。如下,大家得以把deal-1.php改成这么:
?php echo htmlbody; echo 你中意$start,对啊?br; echo a
href=/deal-2.php?start=$start/试试是还是不是会再传下去/a; echo /body/html; ?
分晰程序,你会开掘只是在deal-1.php后加了一句“?start=$start”就能够了,而那起的职能就是参数字传送递。如:
其?后的为参数,no为参数名,其值为1。那样,会在cartoon.php程序中发出变量$no,其值为1。若传四个以上参数,其间用&分隔。如:
为了延长参数的生命周期,大家还足以应用Cookie或Session来兑现,这里不增添述,在这里后的篇章中您会看出它们的用法。
----

异步的公文上传是在现世的AJAX完成的Web应用里面平时要相遇,必得消灭的标题。可是正式的AJAX类(XmlHttpRequest)不可能落到实处传输文件的法力。由此,这里研商的内容正是怎样在AJAX的本事的基本功之上营造异步的文书上传功效。在这里个效率当中必要使用到内置的框及(IFRAME)来传输文件。那个功效完结的作用是页面在上传文件的时候,客商还足以行使该页面並且填写文件陈说。

  那个事例是大家援用AJAX的卓越案例开展解析的。

  系统景况

  · 较新本子的浏览器。比如Opera,Firefox也许 Internet Explorer。

  · PHP 4.3.0 或更加高版本

  · PHP 5 版本

  · PHP 中的 ‘short_open_tag’ 选项开启(不然会爆发拆解深入分析错误卡塔尔(قطر‎。

  功能解析

  通过嵌入的IFRAME(框架)实行文件上传。具有蕴含两个部分组成。

  · 在页面中间有七个简易的<form…表单,表单只含有了<input
type=”file” … >控件。那个表单的靶子链接就是二个藏身得IFRAME(通过
CSS的品格” display:
none;”完毕卡塔尔(قطر‎并且表单里面独一四个控件的OnChange事件用来触发JavaScript函数。那一个函数的效力是检查顾客提交的恢弘名,然后交给表单。

  ·
在服务器端用PHP编写了三个管理进程(用FILEFRAME坐注释了)。那一个管理进程用来把从顾客端上传的文本实行反省后保存在服务器,并且经过Javascript代码的款型重回给顾客。重回给顾客的Javascript脚本通过”parent.window.document”改善了客户未来正值查阅的页面,设置了文件的称呼并启用了让顾客提交表单的按键。启用开关的操作是通过getElementById函数达成的。

  ·
在主页面还会有七个表单,它含有了客商提交的呈报和潜伏的文件名。客户能够在文书上传的还要填写文件的汇报。当文件上传截止以往,顾客点击开关,就足以倾心传以后返回给客商的公文信息了。(通过重回来的文件名和顾客输入的叙说构成文件消息)。

  大概您会说这么操作不相符常理:文件在客商确认此前就早就被提交了。借使顾客并未交给的话,情况会怎么着呢。你能够本人在扩张处理被顾客吐弃的文件。

  那个事例把文件存储在叁个文件系统的目录下。你要求在剧本开始运营的时候配置下这么些目录,具体的蕴藏那些目录新闻的变量是$upload_dir
和$web_upload_dir。这里有叁个对目录是或不是可写的权杖检查。

  这里大家用到了以下多少个PHP函数:

  · move_uploaded_file – 转移一经上传出服务器的文书

  · fopen – 打开文件

  · fwrite – 把内容写入文件

  · fclose – 关闭文件

  · str_replace – 替换字符串

  · filesize – 重临文件大小

  · filemtime – 重返处理时间

  你能够经过手册查到那一个函数假设使用。请介怀要把HTM(<, >,
&卡塔尔(قطر‎标识替换为(<, > 和 &State of Qatar.

  源代码

<?php
$upload_dir = “/var/www/anyexample/aeu”; // 文件存款和储蓄的渠道
$web_upload_dir = “/aeu”; // 文件在Web目录下的门路
$tf = $upload_dir.’/’.md5(rand()).”.test”;
$f = @fopen($tf, “w”);
if ($f == false)
die(“Fatal error! {$upload_dir} is not writable. Set ‘chmod 777
{$upload_dir}’
or something like this”);
fclose($f);
unlink($tf);

//管理上传的文书
if (isset($_POST[‘fileframe’]))
{
 $result = ‘ERROR’;
 $result_msg = ‘No FILE field found’;

 if (isset($_FILES[‘file’]State of Qatar卡塔尔国 // 从浏览器接纳文件
澳门新葡萄京官网注册 , {
  if ($_FILES[‘file’][‘error’] == UPLOAD_ERR_OK卡塔尔(قطر‎ // 对的误
  {
   $filename = $_FILES[‘file’][‘name’]; // 文件名
   move_uploaded_file($_FILES[‘file’][‘tmp_name’],
$upload_dir.’/’.$filename);
   // 管理的主进程-转移文件到 $upload_dir
   $result = ‘OK’;
  }
  elseif ($_FILES[‘file’][‘error’] == UPLOAD_ERR_INI_SIZE)
   $result_msg = ‘The uploaded file exceeds the
upload_max_filesize directive in php.ini’;
  else
   $result_msg = ‘Unknown error’;
 }

 echo ‘<html><head><title>-</title></head><body>’;
 echo ‘<script language=”JavaScript”
type=”text/javascript”>’.”n”;
 echo ‘var parDoc = window.parent.document;’;
 ’
 if ($result == ‘OK’)
 {
  echo ‘parDoc.getElementById(“upload_status”).value = “file
successfully uploaded”;’;
  echo ‘parDoc.getElementById(“filename”).value = “‘.$filename.'”;’;
  echo ‘parDoc.getElementById(“filenamei”).value =
“‘.$filename.'”;’;
  echo ‘parDoc.getElementById(“upload_button”).disabled = false;’;
 }
 else
 {
  echo ‘parDoc.getElementById(“upload_status”).value = “ERROR:
‘.$result_msg.'”;’;
 }

 echo “n”.’</script></body></html>’;
 exit();
}

function safehtml($s)
{
 $s=str_replace(“&”, “&”, $s);
 $s=str_replace(“<”, “<“, $s);
 $s=str_replace(“>”, “>”, $s);
 $s=str_replace(“‘”, “'”, $s);
 $s=str_replace(“””, “"”, $s);
 return $s;
}

if (isset($_POST[‘description’]))
{
 $filename = $_POST[‘filename’];
 $size = filesize($upload_dir.’/’.$filename);
 $date = date(‘r’, filemtime($upload_dir.’/’.$filename));
 $description = safehtml($_POST[‘description’]);

 $html =<<<END
 <html><head><title>{$filename} [uploaded by IFRAME Async file
uploader]</title></head>
 <body>
  <h1>{$filename}</h1>
  <p>This is a file information page for your uploaded file.
Bookmark it, or send to anyone…</p>
  <p>Date: {$date}</p>
  <p>Size: {$size} bytes</p>
  <p>Description:
  <pre>{$description}</pre>
  </p>
  <p><a href=”{$web_upload_dir}/{$filename}” style=”font-size:
large;”>download file</a><br>
  <a href=”{$PHP_SELF}” style=”font-size: small;”>back to file
uploading</a><br>
  <a href=”{$web_upload_dir}/upload-log.html” style=”font-size:
small;”>upload-log</a></p>
  <br><br>Example by <a
href=”
 </body></html>
 END;
 
 $f = fopen($upload_dir.’/’.$filename.’-desc.html’, “w”);
 fwrite($f, $html);
 fclose($f);
 $msg = “File {$filename} uploaded,
 <a href='{$web_upload_dir}/{$filename}-desc.html’>see file
information page</a>”;

 $f = fopen($upload_dir.”/upload-log.html”, “a”);
 fwrite($f, “<p>$msg</p>n”);
 fclose($f);

 setcookie(‘msg’, $msg);
 header(“Location: );
 exit();
}

if (isset($_COOKIE[‘msg’]) && $_COOKIE[‘msg’] != ”)
{
 if (get_magic_quotes_gpc())
  $msg = stripslashes($_COOKIE[‘msg’]);
 else
  $msg = $_COOKIE[‘msg’];
  setcookie(‘msg’, ”);
}
?>
<!– Beginning of main page –>
<html><head>
<title>IFRAME Async file uploader example</title>
</head>
<body>
<?php
 if (isset($msg))
  echo ‘<p style=”font-weight: bold;”>’.$msg.’</p>’;
?>
<h1>Upload file:</h1>
<p>File will begin to upload just after selection. </p>
<p>You may write file description, while you file is being
uploaded.</p>

<form action=”<?=$PHP_SELF?>” target=”upload_iframe” method=”post”
enctype=”multipart/form-data”>
 <input type=”hidden” name=”fileframe” value=”true”>
 <!– Target of the form is set to hidden iframe –>
 <!– From will send its post data to fileframe section of this PHP
script (see above) –>

 <label for=”file”>text file uploader:</label><br>
 <!– JavaScript is called by OnChange attribute –>
 <input type=”file” name=”file” id=”file”
onChange=”jsUpload(this)”>
</form>
<script type=”text/javascript”>
/* This function is called when user selects file in file dialog */
function jsUpload(upload_field)
{
 // this is just an example of checking file extensions
 // if you do not need extension checking, remove
 // everything down to line
 // upload_field.form.submit();
 
 var re_text = /.txt|.xml|.zip/i;
 var filename = upload_field.value;

 /* Checking file type */
 if (filename.search(re_text) == -1)
 {
  alert(“File does not have text(txt, xml, zip) extension”);
  upload_field.form.reset();
  return false;
 }

 upload_field.form.submit();
 document.getElementById(‘upload_status’).value = “uploading
file…”;
 upload_field.disabled = true;
 return true;
}
</script>
<iframe name=”upload_iframe” style=”width: 400px; height: 100px;
display: none;”>
</iframe>
<!– For debugging purposes, it’s often useful to remove
“display: none” from style=”” attribute –>

<br>
Upload status:<br>
<input type=”text” name=”upload_status” id=”upload_status”
value=”not uploaded” size=”64″ disabled>
<br><br>

File name:<br>
<input type=”text” name=”filenamei” id=”filenamei” value=”none”
disabled>

<form action=”<?=$PHP_SELF?>” method=”POST”>
 <!– one field is “disabled” for displaying-only. Other, hidden one
is for sending data –>
 <input type=”hidden” name=”filename” id=”filename”>
 <br><br>

 <label for=”photo”>File description:</label><br>
 <textarea rows=”5″ cols=”50″ name=”description”></textarea>

 <br><br>
 <input type=”submit” id=”upload_button” value=”save file”
disabled>
</form>
<br><br>
<a href=”<?=$web_upload_dir?>/upload-log.html”>upload-log</a>
<br><br><br>

Example by <a href=”
</body>
</html>
澳门新葡萄京官网注册 1

发表评论

电子邮件地址不会被公开。 必填项已用*标注