【问题标题】:Warning: copy() [function.copy]: Filename cannot be empty警告:copy() [function.copy]:文件名不能为空
【发布时间】:2013-06-18 15:09:00
【问题描述】:

我正在通过 HTML 表单上传 .PDF 和 .ZIP 文件,然后将其传递给我的 PHP 脚本,在该脚本中,文件从临时文件夹移动并放置在指定文件夹中。现在这对 2mb 以下的文件非常有效,任何超过我都会收到以下错误消息:

Warning: copy() [function.copy]: Filename cannot be empty

文件名不为空,代码适用于小于 2mb 的文件。

我在 /etc/ 文件夹中检查了我的 php.ini 文件(我正在运行 centos6.4)及其配置中我有

 upload_max_filesize = 50M

我认为这仍然是一个 PHP 配置问题,导致超过 2mb 的文件出现错误,我还需要查看其他配置吗?

<?php
session_start();
$ref = $_POST['doc_ref'];
$rev = $_POST['doc_rev'];
$owner = $_POST['doc_owner'];
$contract = $_POST['contract'];
$cat = $_POST['cat'];
$type = $_POST['type'];
$pdf = $_FILES['pdf'];
$zip = $_FILES['zip'];
$pdf_name = $_FILES['pdf']['name'];
$content = $_POST['doc_content'];
$userid = $_SESSION['users_id'];
date_default_timezone_set('UTC');
$date = date_create();

// get the pdf from the form then remove the extension
$title = $_FILES["pdf"]["name"];
$title = pathinfo($title,PATHINFO_FILENAME);


$sth = "SELECT * FROM `contracts` WHERE `contracts_id`='$contract'";
$result = $conn->query($sth);   
while($row = $result->fetch(PDO::FETCH_ASSOC))
{
    $contract_name = $row['contracts_name'];
    $contract_prefix = $row['prefix'];
}

if ($contract_prefix)
{
    if ($type === '1')
    {
    $zippath = "zips/" . $contract_prefix . "/" . $contract_name . "/Forms/";
    $arcpath = "arc/" . $contract_prefix . "/" . $contract_name . "/Forms/";
    $pdfpath = "pdfs/" . $contract_prefix . "/" . $contract_name . "/Forms/";
    }elseif ($type === '2')
    {
    $zippath = "zips/" . $contract_prefix . "/" . $contract_name . "/Work Instructions And Process Flows/";
    $arcpath = "arc/" . $contract_prefix . "/" . $contract_name . "/Work Instructions And Process Flows/";
    $pdfpath = "pdfs/" . $contract_prefix . "/" . $contract_name . "/Work Instructions And Process Flows/";
    }
}else
{
    if ($type === '1')
    {
    $zippath = "zips/" . $contract_name . "/Forms/";
    $arcpath = "arc/" . $contract_name . "/Forms/";
    $pdfpath = "pdfs/" . $contract_name . "/Forms/";
    }elseif ($type === '2')
    {
    $zippath = "zips/" . $contract_name . "/Work Instructions And Process Flows/";
    $arcpath = "arc/" . $contract_name . "/Work Instructions And Process Flows/";
    $pdfpath = "pdfs/" . $contract_name . "/Work Instructions And Process Flows/";
    }
}

$pdfpath = $pdfpath . $_FILES["pdf"]["name"];
$zippath = $zippath . $_FILES["zip"]["name"];
// create archpath to store for later use
$arcpathfinal = $arcpath;
// append the current revision to the start of the zip files name for the arc
$arcpath = $arcpath . "Revision " . $rev . " - " . $_FILES["zip"]["name"];

//check the uploaded file is in PDF format and then move to correct directory
$allowed =  array('pdf');
$pdf = $_FILES['pdf']['name'];
$ext = pathinfo($pdf, PATHINFO_EXTENSION);
if(!in_array($ext,$allowed) ) {
    echo 'The file type must be a PDF!';
}else
{
    // move zip and pdf into correct folders
    move_uploaded_file($_FILES["pdf"]["tmp_name"], $pdfpath);
    move_uploaded_file($_FILES["zip"]["tmp_name"], $zippath);
}

// make a copy of zip file into arc folder
copy($zippath, $arcpath);

//INSERTING INTO DATABASE CODE HERE

更新

好的,我已经做了一些测试,当文件大小超过 2MB 时,$_FILES 数组似乎为空,小于 2MB 的数组按预期返回名称、类型、tmp_name、错误、大小。

$_FILES 为空且文件超过 2MB 的原因是什么。是的,我的upload_max_filesize 设置为高于文件大小,而我的post_max_size 设置为高于我的upload_max_filesize。是的,我在更改 php.ini 文件后重新启动了 Apache

【问题讨论】:

  • 您可能无法上传大于 2MB 的文件。这会导致您的目标路径丢失文件名和原始路径。这就是复制失败的原因。在继续复制操作之前,您必须验证 move_uploaded_file 确实成功。
  • 小提示。仅仅因为您使用 PDO 并不意味着您是安全的。你不。您应该使用带有绑定参数的预编译语句,或者任何它们被调用的语句。如果$contract'; DROP TABLE contracts; --lulz 会怎样?它会给我 zeequel injwecshun。
  • @ColeJohnson 准备的语句是 :)
  • @ColeJohnson 是的,谢谢,我在插入最终数据时使用命名占位符绑定参数,但对于上面的 select 语句没有。这只是一个封闭的个人项目,但它的确定性是我今后将保持警惕的事情

标签: php


【解决方案1】:

http://www.php.net/manual/en/ini.core.php#ini.post-max-size

设置允许发布数据的最大大小。此设置也会影响文件上传。要上传大文件,该值必须大于upload_max_filesize。

【讨论】:

  • 还有网络服务器本身的限制。如果您没有为每个进程分配足够的内存,它将无法工作。
  • 谢谢,我已经尝试过了,但没有什么不同,@Cole Johnson,你能指出这个限制所在的方向吗?
  • @twigg 没有办法改变这个限制。如果您的网络托管设置了这样的限制,那么您就是 SOL。如果他们不这样做,你能得到的最接近的方法是增加服务器的内存 (RAM)。
  • @ColeJohnson 谢谢科尔,这应该不是问题,因为它是我的本地服务器,它有 24GB 内存,所以应该可以覆盖我试图上传的 15mb 文件,这个真的让我很难过现在,我猜它必须是另一个配置设置。
猜你喜欢
  • 1970-01-01
  • 2013-03-19
  • 1970-01-01
  • 1970-01-01
  • 2012-05-24
  • 2014-01-31
  • 1970-01-01
  • 1970-01-01
  • 2015-01-21
相关资源
最近更新 更多