我有一个非常标准的上传表单。一些文本输入,文件上传输入,reCAPTCHA和提交按钮。
在正常使用下,我可以上传一个小文件就好了。表单数据被重定向到action属性中的页面,并且在处理上载的PHP和SQL中完成了一些事情。
但是,在尝试上传40 MB文件时,它根本不起作用。起初,我认为这是CAPTCHA,因为它给了我关于未能输入正确单词的错误。禁用CAPTCHA后,我发现定义了所有$ _POST ['input']的变量没有被传递。我会得到PHP错误,如:
Notice: Undefined index: name in /var/www/upload.php on line 18
第18行是$name=$_POST['name'];
对于我表单中的每个输入,我都会得到其中一个。
这告诉我POST没有被设置,因为在发送大文件时表单不起作用,所以我的问题只是......为什么?当然,解决方案是什么?
编辑:相关代码:
提交表格:
<form action="/upload.php" method="post" enctype="multipart/form-data">
<ul>
<li>
<input class="text" type="text" name="name">
</li>
<li>
<input class="text" type="email" name="email" placeholder="<?php echo $content['SubmitFormEmailPlaceholder'];?>">
</li>
<li>
<input type="file" name="file">
<input class="text" type="text" name="url" placeholder="http://">
</li>
<li>
<textarea class="text" name="notes" rows="5"></textarea>
</li>
<li>
<?php
require_once($_SERVER['DOCUMENT_ROOT'].'/resources/recaptchalib.php');
$publickey = "key";
echo recaptcha_get_html($publickey);
?>
</li>
<li>
<input type="submit">
</li>
</ul>
</form>
上传代码:
<?php
date_default_timezone_set('UTC');
//echo $_FILES['file']['error'];
require_once($_SERVER['DOCUMENT_ROOT'].'/resources/recaptchalib.php');
$privatekey="key";
$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","password",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'];
}
}
}
?>
答案 0 :(得分:5)
尝试并增加upload_max_filesize
文件中的post_max_size
和php.ini
。将它们设置为50M以确定。
你也应该在改变之后重启apache。这取决于您的设置,因此将pathToApache替换为服务器上的apache路径;
sudo /etc/pathToApache/apache2 restart
答案 1 :(得分:1)
问题在于你的php web服务器配置文件。所以你必须在服务器的php.ini文件中将post_max_size和upload_max_filesize更改为100。如果您无权在服务器中更改它,那么在您的htaccess文件中添加以下行:
php_value post_max_size 100M
php_value upload_max_filesize 100M
答案 2 :(得分:0)
比简单地更新你的php.ini max_upload_filesize更好的答案是实际编码,期望错误可能发生,并适当地处理它们。提高你的文件大小是最大问题的最后一个问题,在这个问题中,你期望世界是完美的,你的代码将始终在所有测试用例下完美运行。
实现所述更好方法的一种方法:
if($_FILES['fileVarName']['error'] != UPLOAD_ERR_OK) {
// we had an error uploading the file, let's handle it like a boss
}
以下列出了可能的错误:http://www.php.net/manual/en/features.file-upload.errors.php