【发布时间】:2014-03-24 09:01:36
【问题描述】:
这里发生了什么?我有一个表单,它可以精确地用于较小的文件,但是一旦我尝试上传更大的文件,表单就会失败。我不知道这个大小限制是多少,但它绝对不适用于 40MB 的文件。
普通文件返回错误 0,表示它们已成功上传,但对于大文件,我什至没有收到错误。就好像表单中的任何内容都没有通过,这也包括表单中所有其他输入的值。大文件有些东西会完全阻止表单中的任何内容工作。
我已经检查了我的 php.ini 以确保 upload_max_filesize 和 post_max_size 值足够高,它们是(每个 200M)。由于此服务器是本地服务器,并且我测试的文件会立即“上传”,但我还确保 max_execution_time 也足够高(1200)。
表单使用POST,enctype是multipart/form-data,我已经尝试过使用只有文件输入和提交按钮的表单。
这是上传代码(即表单重定向到的操作页面中的代码):
<?php
require_once($_SERVER['DOCUMENT_ROOT'] . '/resources/recaptchalib.php');
$privatekey = "abc123";
$resp = recaptcha_check_answer($privatekey,
$_SERVER["REMOTE_ADDR"],
$_POST["recaptcha_challenge_field"],
$_POST["recaptcha_response_field"]);
if (!$resp->is_valid) {
echo "<h1>" . $content['UploadError'] . "</h1>"
. $content['UploadCaptcha'] . "<br><br>"
. $content['UploadReturn'];
} else {
$name = $_POST['name'];
$email = $_POST['email'];
if (empty($name)) {
echo "<h1>" . $content['UploadError'] . "</h1>" .
$content['UploadName'] . "<br><br>" .
$content['UploadReturn'];
} elseif (empty($email)) {
echo "<h1>" . $content['UploadError'] . "</h1>"
. $content['UploadEmail'] . "<br><br>"
. $content['UploadReturn'];
} else {
$url = $_POST['url'];
$notes = $_POST['notes'];
$timedate = date('YmdHis');
$dbHandle = new PDO("mysql:host=localhost;dbname=upload;", "user", "pass",
array(PDO::ATTR_EMULATE_PREPARES => false));
$dbHandle->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$query = $dbHandle->prepare("INSERT INTO `data` "
. "(approved,name,email,fileid,url,notes,timedate,viewcount) "
. "VALUES(?,?,?,?,?,?,?,?)");
$types = array(
'jpg', 'jpeg', 'gif', 'png',
'mp3', 'wma', 'wav', 'ogg', 'aac', 'flac',
'avi', 'wmv', 'mov', 'ogg', 'webm', 'mpg', 'mpeg', 'mp4'
);
$filechk = (isset($_FILES['file']) && !empty($_FILES['file']['name']));
$urlchk = (isset($url) && !empty($url));
if (!$filechk ^ $urlchk) {
echo "<h1>" . $content['UploadError'] . "</h1>"
. $content['UploadFileURL'] . "<br><br>"
. $content['UploadReturn'];
} elseif ($filechk) {
$filesize = (75 * 1024 * 1024);
$up_path = $_SERVER['DOCUMENT_ROOT'] . '/resources/uploads/';
$filename = $timedate . $_FILES['file']['name'];
$ex = explode(".", $filename);
$ext = strtolower(end($ex));
if (file_exists($up_path . $filename)) {
$filename = $timedate . 'Duplicate.' . $ext;
}
if (!in_array($ext, $types)) {
echo "<h1>" . $content['UploadError'] . "</h1>"
. $content['UploadFileType'] . "<br><br>"
. $content['UploadReturn'];
} elseif (filesize($_FILES['file']['tmp_name']) > $filesize) {
echo "<h1>" . $content['UploadError'] . "</h1>"
. $content['UploadFileSize'] . ($filesize / 1024 / 1024) . " MB<br><br>"
. $content['UploadReturn'];
} elseif (!is_writable($up_path)) {
echo "<h1>" . $content['UploadError'] . "</h1>"
. $content['UploadWriteError'] . "<br><br>"
. $content['UploadReturn'];
} elseif (move_uploaded_file($_FILES['file']['tmp_name'], $up_path . $filename)) {
$fileid = $filename;
$url = null;
$query->execute(array('N', $name, $email, $fileid, $url, $notes, $timedate, '0'));
echo "<h1>" . $content['UploadSuccess'] . "</h1>"
. $content['UploadHomepage'];
} else {
echo "<h1>" . $content['UploadUnknownError'] . "</h1>"
. $content['UploadReturn'];
}
} else {
$fileid = null;
$query->execute(array('N', $name, $email, $fileid, $url, $notes, $timedate, '0'));
echo "<h1>" . $content['UploadSuccess'] . "</h1>"
. $content['UploadHomepage'];
}
}
}
?>
var_dump($_FILES) 结果为 array(0) { }
所以我的 php.ini 似乎很好,我的代码似乎很好(因为我可以上传较小的文件)...我在这里缺少什么?
【问题讨论】:
-
你能把你的
$_FILES转储吗? -
你的磁盘一定有大小问题?
-
磁盘没问题。 @Maerlyn:怎么样?
-
@Hiigaran 在上传后执行
var_dump($_FILES)并使用输出更新您的问题。 -
完成。将结果转储到 array(0) { }
标签: php forms file-upload