【问题标题】:PHP move_uploaded_file function very pickyPHP move_uploaded_file 函数很挑剔
【发布时间】:2013-01-29 14:17:28
【问题描述】:

我的网站上的 move_uploaded_file 功能有问题。

整个想法是在表单中插入项目的标题、描述和屏幕截图。一切正常。它将标题和描述以及 id 和创建日期保存在 mysql 数据库中,并将文件移动到服务器上的文件夹中。

然而,问题是有些文件被传输到文件夹,而有些则没有。问题似乎出在文件中,但我似乎无法弄清楚问题所在。

不是文件大小;我有 5/6MB 的文件放在文件夹中没有任何问题,我有大约 3MB 的文件。扩展名也不是问题,它们都是 .jpg。

.jpg 文件是否需要满足其他要求才能上传?

我 99% 确定问题不在我的代码中,因为它可以毫无问题地上传一些文件,但无论如何这是我的代码。

HTML 部分:

<form action="" method="post" enctype="multipart/form-data">
    <h2>Title*</h2>
    <input type="text" id="title" name="title">
    <h2>Description*</h2>
    <textarea id="descr" name="descr" cols="40" rows="4"></textarea>
    <h2>Add file*</h2>
    <input type="file" id="file" name="file">
    <h2><input type="submit" id="submit" name="submit" value="Uploaden"></h2>
    <p id="requirements">Fields marked with * are required.</p>
</form>

这是 PHP 部分:

if (isset($_POST['submit'])) {

$destination = "../uploadedfiles/" . basename($_FILES['file']['name']);

if (move_uploaded_file($_FILES['file']['tmp_name'], $destination)) {
    echo '<p id="succes">File has been uploaded</p>';
} else {
    echo '<p id="error">File has not been uploaded</p>';
}

$title = $_POST['title'];
$descr = $_POST['descr'];
$name = ($_FILES['file']['name']);

include "../connect/connect.php";

if ($title == "" || $descr == "") {
    echo '<p id="error">Fill in the required fields</p>';
} else {

    $query = "INSERT INTO file(title, descr, name, created) VALUES ('{$title}', '{$descr}', '{$name}', NOW())";

    $upload = $connect->query($query);

    if ($upload) {
        echo '<p id="succes">Info is stored in database</p>';
    } else {
        echo '<p id=error>Failed to store info in database</p>';
    }
}
}

【问题讨论】:

  • 文件夹权限设置成什么?
  • 我认为上面的代码中没有检查文件类型?
  • 我还在本地工作,权限设置为完全控制
  • 确实,Tom,我这样做是为了让 png 文件、gif 文件和其他图像类型也可以上传
  • @PatrickBokhove 通过“有些文件正在传输而有些没有”这些文件属于同一类型吗?即文件扩展名?

标签: php file-upload file-io


【解决方案1】:

一堆东西可能会出错。 move_uploaded_file 非常挑剔,有时它的行为与记录的方式不同。老实说,我曾经遇到过问题,如果正确实施,在大多数情况下复制存档相同的结果。

  • 有报告称单独的文件名会导致问题。 $destination 上的 249 个字符似乎是限制。
  • 不仅要设置upload_max_filesize,还要设置post_max_size
  • utf-8 名称可能是个问题
  • 如果您遇到无法访问上传文件的问题,请尝试使用 copy()。有报道说上传后找不到文件,move_uploaded_file只是限制路径超过复制,如果不输入任何用户var,结果是一样的。

【讨论】:

  • 感谢您的回复,但是字符的限制不是问题。我要上传的文件名为 DSC_0001。当我简单地将名称更改为 1.jpg 时,它也不起作用。 upload_max_filesize 和 post_max_size 设置为默认值,即 2MB 和 8MB,但有些 4MB 的项目上传没有问题。正在上传的文件是完全可访问的。我将尝试复制并通知您。
  • 太棒了,它成功了。它仍然让我感到困惑,它之前如何能够上传 4MB 的文件,但我不会伤害我试图理解这一点的大脑。我将在我的代码中添加一个检查以防止超过最大文件大小。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-14
  • 2020-11-04
相关资源
最近更新 更多