虽然大多数人认为Web只包含网页,但HTTP协议实际上可以传输任何文件,如office文档、PDF、可执行文件、AVI、压缩文件及各种其他文件类型。虽然FTP在历史上一直是向服务器上传文件的标准方式,但通过网页上传文件也逐渐流行起来。

一.PHP上传配置

一般在上传文件之前需要配置php.ini文件,默认可以上传,也可以自己修改

有一些配置指令可用于精细地调节PHP的文件上传功能。这些指令用来确定是否启用PHP的文件上传、可允许的最大上传文件大小、可允许的最大脚本内存分配和其他各种重要的资源。

1.file_uploads=on|off : 确定服务器上的PHP脚本是否可以接受文件上传。

2.max_execution_time=integer :PHP脚本在注册一个致命错误之前可以执行的最长时间,以秒为单位。

3.memory_limit=integer : 设置脚本可以分配到的最大内存,以MB为单位。这可以防止失控的脚本独占服务器内存。

4.upload_max_filesize=integer :设置上传文件最大大小,以MB为单位。此指令必须小于post_max_size。

5.upload_tmp_dir=string :设置上传文件在处理之前必须存放在服务器的临时一个位置,直到文件移动到最终目的地为止。

6.post_max_size=integer :确定通过POST方法可以接受的信息的最大大小,以MB为单位。

二.$_FILES数组

上传表单的HTML

<form enctype="multipart/form-data" action="upload.php" method="post">

<input type="hidden" name="MAX_FILE_SIZE" value="1000000" />

上传文件: <input type="file" name="userfile" />

<input type="submit" value="上传" />

</form>

ENCTYPE="multipart/form-data",这里是固定写法,否则文件上传失败

ACTION="upload.php“,定义要处理上传的程序文件路径

METHOD="post",定义传输方式为POST,一般情况下Form提交数据都设置为POST

<input type="hidden" name="MAX_FILE_SIZE" value="1000000">,这是一个隐藏域,定义了上传文件的大小上限,超过这个值时,上传失败。它必须定义在文件上传域的前面.而且这里定义的值不 能超过在php.ini 文件中upload_max_filesize设置的值,否则没有意义了.(注意:MAX_FILE_SIZE 的值只是对浏览器的一个建议,实际上它可以被简单的绕过。因此不要把对浏览器的限制寄希望于该值。实际上,PHP.ini设置中的上传文件最大值,是不会 失效的。但是最好还是在表单中加上 MAX_FILE_SIZE,因为它可以避免用户在花时间等待上传大文件之后才发现该文件太大了的麻烦。)

<input type="file" name="userfile" />,这是文件上传域,Type属性必须设置为file,但Name属性可以自定义,这个值会在代码文件中使用.

$_FILES超级全局变量,它储存各种与上传有关的信息,这些信息对于通过PHP脚本上传到服务器的文件至关重要。

1.存储在$_FILES["userfile"]["tmp_name"]变量中的值就是文件在Web服务器中临时存储的位置。

2.存储在$_FILES["userfile"]["name"]变量中的值就是用户系统中的文件名称。

3.存储在$_FILES["userfile"]["size"]变量中的值就是文件的字节大小。

4.存储在$_FILES["userfile"]["type"]变量中的值就是文件的MIME类型,例如:text/plain或image/gif。

5.存储在$_FILES["userfile"]["error"]变量中的值将是任何与文件上载相关的错误代码。这是在PHP4.2.0中增加的新特性。error分别提供了一些数组常量:0:表示没有发生错误,1:表示上载文件的大小超出了约定值。文件大小的最大值是PHP配置文件中指定的,该指令是upload_max_filesize。2:表示上载文件大小超出了HTML表单的MAX_FILE_SIZE元素所指定的最大值。3:表示文件只被部分上载。4:表示没有上载任何文件。

<?php

print_r($_FILES);

?>

三.PHP上传函数

PHP的文件系统库中提供了大量文件处理函数,除此之外,PHP还提供了两个专门用于文件上传过程的函数:is_uploaded_file()和move_uploaded_file()。

1.确定是否上传文件:is_uploaded_file()

if (is_uploaded_file($_FILES["userfile"]["tmp_name"])) {

echo '已经上传到临时文件夹';

} else {

echo '失败';

}

2.移动上传文件:move_uploaded_file()

if (!move_uploaded_file($_FILES["userfile"]["tmp_name"],$_FILES["userfile"]["name"])) {

echo '移动失败';

exit;

}

上传文件较完整实例:

demo1.php

<!-- ENCTYPE="multipart/form-data",这里是固定写法,否则文件上传失败 -->

<form enctype="multipart/form-data" action="demo2.php" method="post">
<input type="hidden" name="MAX_FILE_SIZE" value="2000000" />
<input type="file" name="userfile" />
<br />
<input type="submit" value="上传" />
</form>

demo2.php

<?php
//接受文件
print_r($_FILES);
//创建一个常量
define('MAX_SIZE', 2000000);
$fileMimes = array('image/jpeg','image/pjpeg','image/gif','image/png','image/x-png');
define('URL',dirname(__FILE__).'\uploads'); //上传目录写成常量,dirname();把魔法常量的目录部分取出 //只能接受jpg gif png文件
// switch ($_FILES['userfile']['type']){
// case 'image/jpeg':
// break;
// case 'image/pjpeg':
// break;
// case 'image/gif':
// break;
// case 'image/png':
// break;
// case 'image/x-png':
// break;
// default:echo "<script>alert('本站只支持指定类型的图片');history.back();</script>";
// exit;
// }
//改进:看起来专业的写法,检查类型是否是数组中的一种
if(is_array($fileMimes)){ //如果数组存在
if (!in_array($_FILES['userfile']['type'], $fileMimes)){ //看在不在这个数组里
echo "<script>alert('本站只支持指定类型的图片');history.back();</script>";
exit;
}
} //如果上传错误怎么办
if($_FILES['userfile']['error']>0){
switch ($_FILES['userfile']['error']){
case 1:echo "<script>alert('上传文件超过约定值1');history.back();</script>";
break;
case 2:echo "<script>alert('上传文件超过约定值2');history.back();</script>";
break;
case 3:echo "<script>alert('部分上传');history.back();</script>";
break;
case 4:echo "<script>alert('没有任何文件上传');history.back();</script>";
break;
}
exit;
} //文件不能太大
if($_FILES['userfile']['size']>MAX_SIZE){
echo "<script>alert('上传文件不能超过两兆');history.back();</script>";
exit;
} /*上传函数 */
//判读文件是否通过HTTP POST上传的
//通过HTTP POST上传后,文件会存放在临时文件夹下
if (!is_dir(URL)){ //判断目录是否存在
mkdir(URL,0777); //最大权限0777,如果没有这个目录,那么就创建
}
if (is_uploaded_file($_FILES["userfile"]["tmp_name"])) {
//第一个参数,写上文件地址
//第二个参数,要移动到的文件地址
if (!move_uploaded_file($_FILES['userfile']['tmp_name'],URL.'/'.$_FILES['userfile']['name'])){
echo "<script>alert('移动失败');history.back();</script>";
exit;
}
} else {
echo "<script>alert('临时文件夹找不到上传文件');history.back();</script>";
exit;
}
//全部通过就上传成功
echo "<script>alert('文件上传成功');location.href='demo3.php?url=".$_FILES['userfile']['name']."';</script>"
?>

demo3.php:显示出上传图片在demo3.php中

<?php
$url = $_GET['url'];
echo '<img src="uploads/'.$url.'" />';
?>

PHP上传文件示例的更多相关文章

  1. C#使用HttpWebRequest和HttpWebResponse上传文件示例

    C#使用HttpWebRequest和HttpWebResponse上传文件示例 1.HttpHelper类: 复制内容到剪贴板程序代码 using System;using System.Colle ...

  2. python网络编程--FTP上传文件示例

    1.基础版(供学习了解原理使用,low) server服务端 import socket import struct import json server = socket.socket() ip_p ...

  3. Python--day67--CBV和FBV、Request对象及上传文件示例

    1,CBV版添加新的出版社 views.py文件 urls.py文件 2,Request对象: request对象 当一个页面被请求时,Django就会创建一个包含本次请求原信息的HttpReques ...

  4. php 上传文件 示例

    <?php header("content-type:text/html;charset=utf-8"); error_reporting(E_ALL); //session ...

  5. MVC上传文件示例

    [HttpPost] public void SaveFile(FormCollection form) { var c = Request.Files.Count; ]; } @using (Htm ...

  6. 重新想象 Windows 8.1 Store Apps (89) - 通信的新特性: 下载数据, 上传数据, 上传文件

    [源码下载] 重新想象 Windows 8.1 Store Apps (89) - 通信的新特性: 下载数据, 上传数据, 上传文件 作者:webabcd 介绍重新想象 Windows 8.1 Sto ...

  7. PHP上传文件详解 错误提示

    首先在php.ini里配置上载文件.有以下几个重要的配置单: 选项 默认值 说明 post_max_size 8M 控制以后的POST请求的最大规模.必须大于upload_max_filesize选项 ...

  8. MVC3+jquery Uploadify 上传文件

    最近做项目用到了上传图片的功能,以前也写过这类代码,不过都是用传统的file标签,今天整理一个好用的插件Uploadify..都做了一些注释,一看便知. 可以去官网下载最新的:Uploadify下载地 ...

  9. 【转】JSP使用上传文件,并生产高清缩略图示例

    原文地址:http://blog.csdn.net/yakson/article/details/9875731 前言 刚开始本来只想来测试一下Thumbnails生成缩略图的效果的,顺便来学一下js ...

随机推荐

  1. __ block

    1.__block对象在block中是可以被修改.重新赋值的. 2.__block对象在block中不会被block强引用一次,从而不会出现循环引用问题. API Reference对__weak变量 ...

  2. 【51Nod 1622】【算法马拉松 19C】集合对

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1622 简单题..直接暴力快速幂 #include<cstdio&g ...

  3. QQ个人文件夹中的文件被占用,解决办法

    我的情况是记住密码的账号不可以登录,不记住密码的账号确可以登录,突然就这样,我也很郁闷. 找到路径C:\Users\Public\Documents\Tencent\QQ下的UserDataInfo. ...

  4. 求1...n中因子最多的数

    Problem 求[1..N]中素因子数最多且最小的数n,N充分大. Solution 将任意自然数n (n>2) 分解 n=p1^k1 * p2^k2 * p3^k3 * ... * Pm^k ...

  5. <<< Jquery查找元素、选择器使用方法总结

    $("#myDiv"); //根据给定的ID匹配一个元素,用于搜索id 属性中给定的值,id属性必须是唯一的 $("div"); //根据给定的元素名匹配所有元 ...

  6. <<< 入侵网站类提权注入教程

    ---------------------------------------入侵类教程-------------------------------------------------------- ...

  7. [Java] JSP笔记 - Java Bean

    一. Java Bean 是什么? Java Bean 其实就是一个符合特定规则的 Java Class.这些规则包括: 使用 public 声明的公用类 属性使用public 的get,set方法访 ...

  8. html5新增的主体结构元素

    1.  article 主体结构元素 通常是一篇文章.一个页面.一个独立完整的内容模块一般会带个标题,并放在 header 标签中,article 元素可以互相嵌套,使用频率极高,强调独立性,多注意下 ...

  9. rails 常用的知识点

    按惯例先上网址:  http://guides.ruby-china.org/    适合初学者很好的文章 ===========================知识点================ ...

  10. Bash 里的转义序列

    在 Bash 里,一共有五个地方支持反斜杠开头的转义序列,包括两个内部命令 echo 和 printf 的参数里,字符串语法 $'...' 里,还有四个提示符变量 PS1-PS4 里,以及在 Read ...