添加笔记

用户贡献的笔记 32 个笔记

380
CertaiN
10 年前
您最好彻底检查 $_FILES 结构和值。
以下代码绝对不会导致任何错误。

示例
<?php

header
('Content-Type: text/plain; charset=utf-8');

try {

// 未定义 | 多个文件 | $_FILES 损坏攻击
// 如果此请求属于其中任何一项,则将其视为无效。
if (
!isset(
$_FILES['upfile']['error']) ||
is_array($_FILES['upfile']['error'])
) {
throw new
RuntimeException('无效参数。');
}

// 检查 $_FILES['upfile']['error'] 值。
switch ($_FILES['upfile']['error']) {
case
UPLOAD_ERR_OK:
break;
case
UPLOAD_ERR_NO_FILE:
throw new
RuntimeException('没有发送文件。');
case
UPLOAD_ERR_INI_SIZE:
case
UPLOAD_ERR_FORM_SIZE:
throw new
RuntimeException('超出文件大小限制。');
default:
throw new
RuntimeException('未知错误。');
}

// 您也应该在此处检查文件大小。
if ($_FILES['upfile']['size'] > 1000000) {
throw new
RuntimeException('超出文件大小限制。');
}

// 不要信任 $_FILES['upfile']['mime'] 值!!
// 自己检查 MIME 类型。
$finfo = new finfo(FILEINFO_MIME_TYPE);
if (
false === $ext = array_search(
$finfo->file($_FILES['upfile']['tmp_name']),
array(
'jpg' => 'image/jpeg',
'png' => 'image/png',
'gif' => 'image/gif',
),
true
)) {
throw new
RuntimeException('无效的文件格式。');
}

// 您应该为它命名一个唯一的名称。
// 不要在没有任何验证的情况下使用 $_FILES['upfile']['name']!!
// 在此示例中,从其二进制数据中获取安全的唯一名称。
if (!move_uploaded_file(
$_FILES['upfile']['tmp_name'],
sprintf('./uploads/%s.%s',
sha1_file($_FILES['upfile']['tmp_name']),
$ext
)
)) {
throw new
RuntimeException('无法移动上传的文件。');
}

echo
'文件已成功上传。';

} catch (
RuntimeException $e) {

echo
$e->getMessage();

}

?>
18
steve dot criddle at crd-sector dot com
20 年前
Mac 上的 IE 有点麻烦。如果您正在上传一个具有未知文件后缀的文件,IE 会以“application/x-macbinary”的 MIME 类型上传文件。生成的文件包括围绕文件包装的资源分支。不太有用。

以下代码假设 MIME 类型在 $type 中,并且您已将文件的内容加载到 $content 中。如果文件是 MacBinary 格式,它会深入资源分支标头,获取数据分支的长度(字节 83-86)并使用它来摆脱资源分支。

(可能有一种更好的方法,但这解决了我的问题)

<?php
if ($type == 'application/x-macbinary') {
if (
strlen($content) < 128) die('文件太小');
$length = 0;
for (
$i=83; $i<=86; $i++) {
$length = ($length * 256) + ord(substr($content,$i,1));
}
$content = substr($content,128,$length);
}
?>
14
~caetin~ ( at ) ~hotpop~ ( dot ) ~com~
20 年前
摘自手册

如果您的表单中没有选择要上传的文件,PHP 会将 $_FILES['userfile']['size'] 返回为 0,并将 $_FILES['userfile']['tmp_name'] 返回为 none。

从 PHP 4.2.0 开始,“none”不再是未上传文件的可靠判断条件。如果您单击“错误代码”链接,则会记录该内容,但您需要查看 $_FILES['your_file']['error']。如果它是 4,则没有选择文件。
9
am at netactor dot NO_SPAN dot com
22 年前
如果您使用重新编码字符的模块,您的二进制文件可能会上传不正确。例如,对于俄语 Apache,您应该使用
<Files ScriptThatReceivesUploads.php>
CharsetDisable On
</Files>
16
xmontero at dsitelecom dot com
12 年前
如果“大文件”(例如:50 或 100 MB)失败,请检查以下内容

您的服务器出站连接可能很慢,并且可能会超时,不是“执行时间”而是“输入时间”,例如,在我们的系统中,默认值为 60 秒。在我们看来,大型上传可能需要 1 或 2 个小时。

此外,我们还有“会话设置”,这些设置应该在上传后保留。

1) 您可能想查看这些 ini 条目

* session.gc_maxlifetime
* max_input_time
* max_execution_time
* upload_max_filesize
* post_max_size

2) 仍然失败?注意,并非所有内容都可以从脚本本身更改。ini_set() 可能会无法覆盖。

此处提供更多信息
https://php.net/manual/es/ini.list.php

您可以看到“upload_max_filesize”等是 PHP_INI_PERDIR 而不是 PHP_INI_ALL。这使使用 ini_set() 无效
https://php.net/manual/en/configuration.changes.modes.php

改用 .htaccess。

3) 仍然失败?. 只要确保您启用了“.htaccess”来覆盖您的 php 设置。这在 apache 文件中完成。您至少需要 AllowOverride Options。

此处查看
https://php.net/manual/en/configuration.changes.php

如果你的主文件使用的是 AllowOverride None,那么你需要手动允许这个操作。

结论

取决于系统,为了允许 “大型文件上传”,你可能需要层层往上直至修改apache配置。

示例文件

这些对我有效,可实现 100MB 上传,持续 2 小时

在 apache-virtual-host 中
-----------------------------------------------------------
<Directory /var/www/MyProgram>
AllowOverride Options
</Directory>
-----------------------------------------------------------

在 .htaccess 中
-----------------------------------------------------------
php_value session.gc_maxlifetime 10800
php_value max_input_time 10800
php_value max_execution_time 10800
php_value upload_max_filesize 110M
php_value post_max_size 120M
-----------------------------------------------------------

在示例中,
- 由于我的上传时间为 1 到 2 小时,我允许 3 小时 (3600x3)
- 由于我需要 100MB,我为文件预留了一些额外的空间 (110M),并且为整个 POST 预留了更多空间 (120M).
10
jan at lanteraudio dot nl
11 年前
我也遇到了 max_file_size 问题,特别是当上传的文件大小超过设置的 upload_max_filesize 时,没有任何响应,没有错误信息。

我发现这不是 upload_max_filesize 设置的问题,而是 post_max_size 设置导致了没有响应的问题。所以,如果将 post_max_size 设置为比 upload_max_filesize 大得多,至少当文件大小超过 upload_max_filesize 但仍在 post_max_size 限制范围内时,你可能会收到错误响应。

希望这能帮到大家。
17
ceo at l-i-e dot com
19 年前
在示例代码中使用 /var/www/uploads 简直是犯罪,恕我直言。

任何人都不应该将不可信的文件上传到你的 web 目录,无论是在哪个服务器上。

在共享服务器上,你的 web 目录中的任何子目录都不应该具有足够的权限来完成上传操作。共享服务器上的其他用户可以编写 PHP 脚本将他们想要的任何内容写入到这些目录中!

$_FILES['userfile']['type'] 基本上是无用的。
A. 浏览器在 mime 类型方面并不一致,因此你永远无法捕获所有可能的类型组合,即使是对于同一个文件格式。
B. 它可以被伪造,因此本身就是很糟糕的安全性。

你的代码应该检查实际的文件,看看它是否看起来安全可靠。

例如,你可以快速轻松地使用 imagegetsize 检查图片,至少可以确认前 N 个字节看起来像图片。这不能保证它是一个有效的图片,但它能极大地降低它是可执行的安全漏洞文件的可能性。

对于 Un*x 基于服务器,你可以使用 exec 和 'file' 命令来检查操作系统是否认为文件内部内容与你期望的数据类型一致。

过去,我在读取文件上传中的 '/tmp' 文件时遇到了问题。如果 PHP 允许我在调用 move_uploaded_file 之前读取这个文件,那会很棒,但 PHP 不允许,可能是因为它假设我正在做一些危险的事情,去读取不可信的文件。好吧,应该将上传的文件移动到某个暂存目录。然后,你可以尽可能彻底地检查它的内容。如果看起来安全可靠,再将其移动到 web 目录之外的目录中。对该文件的任何访问都应该通过读取文件的 PHP 脚本进行。将文件放到你的 web 目录中,即使你考虑了所有你能想到的检查,也是太危险了,恕我直言。

这里有很多用户贡献的笔记中包含天真的(糟糕的)建议。请谨慎。
9
jedi_aka at yahoo dot com
17 年前
对于那些尝试在 Windows XP/2000/XP Media 等操作系统上使用 IIS 使上传工作的人,这里有一些快速步骤。

1) 在你的代码运行的同一个目录下创建子目录 "uploads/",然后使用 oportocala 中的代码,并确保你尝试写入的文件被写入到该文件夹中。(我建议使用 echo $uploadfile; 打印它)

2) 在 Windows 资源管理器中浏览到上面创建的上传目录,并将其共享。为此,请执行以下子步骤。
a) 右键单击文件夹,然后单击 “共享和安全…”
b) 选中 “在网络上共享此文件夹”
c) 选中 “允许网络用户更改我的文件”(此步骤非常重要)
d) 单击 “确定” 或 “应用”

3) 然后,你可以在 IIS 中设置它的读写权限。为此,请执行以下子步骤。
a) 打开 IIS(开始/控制面板(经典视图)/管理工具/Internet 信息服务)
b) 浏览到你的文件夹(我们上面创建的文件夹)
c) 右键单击并选择 “属性”。
d) 在 “目录” 选项卡中,确保选中 “读取”、“写入” 和 “目录浏览”。
e) 对于注重安全的爱好者来说,你还要确保 “执行权限:” 设置为 “仅脚本” 或更低(不要设置为 “脚本和可执行文件”)(因为有人可能会将脚本上传到你的目录并运行它。而你绝对不希望这种情况发生)。

好了。

如果你成功了,或者没有成功,请告诉我,以便我更新这些步骤。

[email protected]

PS: 感谢 oportocala
14
svenr at selfhtml dot org
17 年前
关于 MAX_FILE_SIZE 隐藏表单字段的说明

PHP 有一个有点奇怪的功能,它会检查多个 “最大文件大小”。

两个广为人知的限制是 php.ini 设置 “post_max_size” 和 “upload_max_size”,它们组合起来对可以接收的最大数据量施加了一个硬性限制。

除了这个,PHP 似乎还实现了一个软限制功能。它会检查是否存在名为 “max_file_size” 的表单字段(大写字母也可以),该字段应该包含一个表示最大允许字节数的整数。如果上传的文件大小大于该字段中的整数,PHP 会阻止上传,并在 $_FILES 数组中返回一个错误代码。

PHP 文档还模糊地提到(或曾经提到 - 参见 bug #40387 - http://bugs.php.net/bug.php?id=40387)“允许浏览器在上传之前检查文件大小”。然而,事实并非如此,而且从未如此。至今为止,没有任何 RFC 建议使用这种命名的表单字段,也没有任何浏览器真正检查过它的存在或内容,或阻止任何操作。PHP 文档暗示浏览器可能会提醒用户他的上传文件太大 - 这完全是错误的。

请注意,使用这个 PHP 功能不是一个好主意。表单字段可以很容易地被客户端修改。如果你必须检查文件的大小,请按照惯例在你的脚本中进行检查,使用脚本定义的整数,而不是从 HTTP 客户端获取的任意数字(从安全角度来看,HTTP 客户端始终是不可信的)。
15
keith at phpdiary dot org
19 年前
注意:*不要*相信 $_FILES['userfile']['type'] 来验证上传的文件类型;如果你这样做,你的服务器可能会受到攻击。下面我将说明原因

手册(如果你向上滚动)指出:$_FILES['userfile']['type'] - 文件的 mime 类型,如果浏览器提供了此信息。例如 “image/gif”。

请记住,这个 mime 类型很容易被伪造,因为 PHP 在验证它是否真的是最终用户报告的类型方面并没有做得太多!

因此,有人可以将恶意的 .php 脚本上传为 “image/gif”,并执行该 “image” 的 url。

我建议你检查文件的扩展名,并使用 exif_imagetype() 检查它是否为有效的图片。许多人建议使用 getimagesize(),它在文件确实为图片时返回一个数组,否则返回 false,但 exif_imagetype() 要快得多。(手册中是这么说的)
11
info at levaravel dot com
15 年前
一个小代码片段,它可以以更易读的格式返回文件大小。

<?php

function display_filesize($filesize){

if(
is_numeric($filesize)){
$decr = 1024; $step = 0;
$prefix = array('Byte','KB','MB','GB','TB','PB');

while((
$filesize / $decr) > 0.9){
$filesize = $filesize / $decr;
$step++;
}
return
round($filesize,2).' '.$prefix[$step];
} else {

return
'NaN';
}

}

?>
5
myko AT blue needle DOT com
18 年前
快速提醒一下,Apache、MAX_FILE_SIZE 隐藏表单字段和 zlib.output_compression = On 之间存在一个问题。似乎即使 PHP 正确地抛出了 MAX_FILE_SIZE 错误,浏览器也会继续上传整个文件。将 zlib 压缩设置为 OFF 似乎可以解决这个问题。我没有时间深入研究并找出谁是罪魁祸首,但我想让其他人免受这种问题的困扰。
6
Rob
16 年前
你的网站根目录中不应该包含任何具有文件上传所需权限的目录。如果你要进行文件上传,我建议你将 PHP FTP 函数与你的文件字段结合使用,这样文件就会被传输到与你的服务器分离的远程 FTP 位置。
2
damien from valex
15 年前
这是一个更简单的检查过多的 POST 数据的方法(v3 from sonic-world.ru 的方法的替代方法)。

<?php
if ($_SERVER['REQUEST_METHOD'] == 'POST' && empty($_POST) && $_SERVER['CONTENT_LENGTH'] > 0) {
throw new
Exception(sprintf('The server was unable to handle that much POST data (%s bytes) due to its current configuration', $_SERVER['CONTENT_LENGTH']));
}
?>
1
Thomas
12 年前
MIME 类型可以伪造。

VVV

$_FILES['userfile']['type']

文件的 MIME 类型,如果浏览器提供了此信息。例如 "image/gif"。但是,此 MIME 类型在 PHP 端没有被检查,因此不要将其值视为理所当然。

https://php.net/manual/en/features.file-upload.post-method.php

[编辑注:删除了对已删除注释的引用,并编辑了注释使其本身有意义。]
2
robpet at tds dot net
19 年前
人们注意到,上传目录上的错误权限可能会阻止上传照片或其他文件。错误地设置目录的 Apache 所有者也会阻止文件上传 - 我使用一个 PHP 脚本,在将上传的文件放入目录之前,它会创建一个目录(如果它不存在)。当脚本创建目录并将上传的文件复制到目录中时,不会出现问题,因为文件的拥有者是 Apache 运行的任何用户,通常是 "nobody"。但是,假设我已将网站移动到新服务器,并使用 FTP 复制了现有文件目录。在这种情况下,所有者将具有与 Apache 所有者不同的名称,并且文件将无法上传。解决方法是使用 CHOWN 命令 TelNet 到网站并重置所有者为 "nobody" 或 Apache 运行的任何用户。
1
rnagavel at yahoo dot com dot au
15 年前
如果 $_FILES 始终为空,请检查表单的方法。
它应该是 POST。表单的默认方法是 GET。

<form action="myaction.php">
<input type="file" name"userfile">
</form>
文件不会上传,因为表单的默认方法是 GET。

<form action="myaction.php" method="POST">
<input type="file" name"userfile">
</form>
文件将被上传,并且 $_FILES 将被填充。
1
geert dot php at myrosoft dot com
18 年前
当文件名包含单引号时,文件名的部分会被丢失。
例如:上传一个文件名
startName 'middlepart' endName.txt
将被上传(并因此存储在 _Files ['userfile'] 变量中为
endName.txt
跳过第二个单引号之前的任何内容。
1
olijon, iceland
20 年前
在上传大型图像时,使用 Netscape 时出现 "文档没有数据" 错误,使用 Explorer 时出现错误页面。我的服务器设置是 RH Linux 9、Apache 2 和 PHP 4.3。

我发现 httpd.conf 文件中缺少以下条目

<Files *.php>
SetOutputFilter PHP
SetInputFilter PHP
LimitRequestBody 524288(最大大小以字节为单位)
</Files>

添加完这些后,一切都顺利运行。

- Oli Jon,冰岛
1
warwickbarnes at yahoo dot co dot uk
18 年前
您可能会遇到以下使用 Microsoft IIS 上的 PHP 问题:即使所有文件夹权限看起来都正确,也从 move_uploaded_file 函数获得权限被拒绝错误。我必须设置以下内容才能使其工作

1. 通过 IIS 管理控制台为文件夹设置写入权限。
2. 在文件夹的安全设置中将写入权限授予 IUSR_'server'。
3. 在文件夹的安全设置中将写入权限授予 "域用户"。

第三个设置是必需的,因为我的应用程序本身位于一个安全文件夹中 - 使用身份验证(基本身份验证或 Windows 集成身份验证)来识别用户。当上传发生时,IIS 似乎正在检查这些用户是否具有对文件夹的写入访问权限,而不仅仅是 Web 服务器 (IUSR_'server') 是否具有访问权限。

此外,请记住在 IIS 管理控制台中将 "执行权限" 设置为 "无",以便人们无法上传脚本文件并运行它。(还建议对上传的文件进行其他检查,但 "执行无" 是一个良好的开端。)
0
david at cygnet dot be
18 年前
如果您在通过 SSL 连接从 Internet Explorer 将文件发布到 PHP 脚本时遇到问题,例如 "无法显示页面" 或 $_FILES 和 $_POST 数组为空(由 jason 在 2006 年 1 月 10 日 02:08 描述),请查看这篇文章微软知识库文章

http://support.microsoft.com/?kbid=889334

这篇文章解释了自 Service Pack 2 以来,从 IE 通过 SSL 发布可能会出现问题。值得检查您的问题是否是 IE 特定的,因为这绝对不是 PHP 问题!
0
Tyfud
19 年前
重要的是要注意,在使用 move_uploaded_file() 命令时,某些配置(尤其是 IIS)如果在目标路径前缀中添加一个前导 "/" 将失败。尝试以下操作

<?php move_uploaded_file($tmpFileName,'uploads/'.$fileName); ?>

设置权限也是必须的。确保所有帐户都对您的上传目录具有写入访问权限,如果您希望稍后查看这些文件,则具有读取访问权限。如果您仍然遇到访问错误,您可能还需要使用 chmod() 对目录或文件进行后续操作。
0
maya_gomez ~ at ~ mail ~ dot ~ ru
20 年前
当您上传文件时,$_FILES['file']['name'] 包含其转换为服务器默认字符集的原始名称。
如果名称包含默认字符集中不存在的字符,则转换失败,$_FILES['file']['name'] 保持原始字符集。

我在从 windows-1251 环境上传到 koi8-r 时遇到了这种行为。如果文件名包含数字符号 "?" (0xb9),它不会被转换,因为 koi8-r 中没有这样的字符。

我使用的解决方法

<?php
if (strstr ($_FILES['file']['name'], chr(0xb9)) != "")
{
$_FILES['file']['name'] = iconv (
"windows-1251",
"koi8-r",
str_replace (chr(0xb9), "N.", $_FILES['file']['name']));
};
?>
-1
mariodivece at bytedive dot com
18 年前
只是想指出一个可能对某些人感兴趣的细节

使用 base64_encode 将二进制数据存储在数据库中时,数据的尺寸会增加 1.33 倍。有一种更好的方法可以将数据直接存储。尝试以下操作

<?php $data = mysql_real_escape_string($data); ?>

这将保持数据不变,并以正确的方式格式化,并准备直接插入 MySQL 语句中,而不会浪费空间。

顺便说一句,我要感谢 therebechips 给出的有关数据块的出色建议。
-1
djot at hotmail dot com
18 年前
-
使用以下方法设置 max_file_size 时要小心
<?php ini_get('upload_max_filesize'); ?>

ini_get 可能会返回类似 "2M" 的值,这会导致上传失败。

这是我的情况下的 "错误"

<?php
$form
= '<input type="hidden" name="MAX_FILE_SIZE" value=".ini_get('upload_max_filesize')." />';
?>

文件被上传到服务器,但是没有上传信息,甚至没有错误消息。$_FILES 彻底为空。

djot
-
-1
therhinoman at hotmail dot com
19 年前
如果您的上传脚本仅用于上传图像,您可以使用图像函数 getimagesize()(不需要 GD 图像库)来确保您确实获得了图像,还可以过滤图像类型。

<?php getimagesize($file); ?>

...如果文件不是图像或不可访问,将返回 false,否则将返回一个数组...

<?php
$file
= 'somefile.jpg';

# 假设您已经采取了一些其他
# 预防措施,例如检查文件
# 扩展名...

$result_array = getimagesize($file);

if (
$result_array !== false) {
$mime_type = $result_array['mime'];
switch(
$mime_type) {
case
"image/jpeg":
echo
"file is jpeg type";
break;
case
"image/gif":
echo
"file is gif type";
break;
default:
echo
"file is an image, but not of gif or jpeg type";
}
} else {
echo
"file is not a valid image file";
}
?>

使用此函数以及本页上提到的其他函数,图像加载可以变得非常可靠。

请参阅 https://php.net/manual/en/function.getimagesize.php 以了解支持的图像类型和更多信息。
-2
Leevi at izilla dot com dot au
19 年前
这可能对文件上传新手有所帮助.. 我从朋友那里得到了建议来修复它..

如果您使用的是
-Windows XP
-IIS 5
-PHP 5

如果您一直收到文件上传的权限错误... 并且您已经确定您已在 IIS 中将权限设置为写入该目录...

请再次检查
a) 在 Windows 资源管理器中,在工具 > 文件夹选项下
单击查看选项卡
一直向下滚动到 "使用简单文件共享(推荐)"
取消选中此框

b) 找到您希望上传到的服务器上的文件夹
c) 单击属性,然后单击安全选项卡
d) 确保选中了相应的写入设置。

您可能希望通过将 "所有人" 设置为具有完全权限来进行测试....

注意,这样做会打开服务器上的重大安全漏洞....

希望这有帮助

Leevi Graham
-7
Phil Ciebiera
14 年前
在使用 IIS 的 Microsoft 平台上,您可能会遇到以下情况:在移动上传的文件后,匿名 Web 用户无法访问内容,而不会被提示先进行身份验证...

造成这种情况的原因是,上传的文件将继承 php.ini 中的 upload_tmp_dir 指令指定的目录的权限。如果没有设置此指令,则使用默认的 C:\Windows\Temp。

您可以通过授予 IUSR_[服务器名称] 用户对临时上传目录的读取权限来解决此问题,这样在您使用 move_uploaded_file 移动文件后,权限将已正确设置。

出于安全原因,最好将上传目录的执行权限设置为不包含可执行文件。
要实现此目的
- 打开 IIS 管理器
- 浏览到将放置上传文件的相关站点目录
- 右键单击文件夹,然后选择属性
- 在生成的对话框的目录选项卡中,将执行权限设置为无

我花了一段时间才弄清楚,希望这能节省其他人的时间。
-6
jahajee
16 年前
您好,我在使用 upload_max_filesize 时遇到了困难,如果将最大文件大小设置为小于 php 设置的大小,那么您的脚本报告错误将只在您设置的最大文件大小和 php 设置的最大文件大小之间的差异范围内起作用。因此,如果上传的文件超过了 php 的最大文件大小,那么 php 会突然终止,没有任何错误迹象,也就是说它表现得好像没有上传文件,因此没有报告任何错误。当然,如果上传文件对于表单来说是可选的,那么上传较大文件的用户将不会收到任何错误,并且表单仍将被处理,只是没有文件而已。
使用 GET 方法无法用于可选上传。即使在错误中也找不到帮助。请谨慎使用可选上传。
jahajee
-8
ragtime at alice-dsl dot com
16 年前
我不相信“memory_size”应该等于上传文件大小的说法。文件肯定不会保存在内存中……而是将每个 1MB 的上传块存储在 /var/tmp 中,然后在移动到 web/user 空间之前在 /tmp 中重建。

我正在使用一个只有 64MB 内存的 Linux 机器,将 memory_limit 设置为 16MB,上传大约 100MB 的文件完全没有问题!不过,一些用户报告了在几百 MB 时出现问题,但尚未得到证实…… ;-)

php.ini 中的其他大小设置为 1GB,时间设置为 300……也许是执行时间限制在之前,因为 CPU 只是一个 233MHz 的 CPU…… :-)

====

好了……我终于明白了!

如果您中有些人也有上传大文件的问题,但 php.ini 中的通常大小/时间是正常的,请检查

session.gc_maxlifetime

当您使用上传脚本进行会话管理时!

默认值为 1440,也就是 24 分钟……所以,如果上传速率只有 600kbit/s,那么会话将在上传后自动关闭
大约 100MB。实际上,您可以上传更多,但文件不会从临时文件夹复制到目标文件夹…… ;-)

您也可以在 php 脚本中直接设置该值,方法是
<?php ini_set("session.gc_maxlifetime","10800"); ?>
-16
shubhamtakode at gmail dot com
9 年前
// 处理简单 HTTP 上传的代码

<?php
// 上传文件的属性
$name= $_FILES["myfile"]["name"];
$type= $_FILES["myfile"]["type"];
$size= $_FILES["myfile"]["size"];
$temp= $_FILES["myfile"]["temp_name"];
$error= $_FILES["myfile"]["error"];

if (
$error > 0)
    die("上传文件错误!代码 $error.");
else
   {
    if($type=="image/png" || $size > 2000000)// 文件条件
    {
    die("格式不允许或文件大小太大!");
    }
    else
    {
     move_uploaded_file($temp, "uploaded/" .$name);
     echo "上传完成!";
     }
}

?>
-11
garyds at miraclemedia dot ca
21 年前
正如已经提到的,基于 Windows 的服务器在使用 move_uploaded_file() 时,会遇到将上传文件移动到的路径问题……这可能也是 copy() 工作而 move_uploaded_file() 不工作的原因,但当然 move_uploaded_file() 是更好的方法。上述说明中的解决方案说您必须在路径中使用“\\”,但我发现“/”也能工作。所以,为了得到一个可用的路径,我使用了类似于

"g:/rootdir/default/www/".$_FILES['userfile']['name']

...的效果,它像一个魅力一样工作。

我在 win2k 服务器上使用 PHP 4.3.0。

希望这有帮助!
To Top