【问题标题】:Uploading multiple files with user entered name使用用户输入的名称上传多个文件
【发布时间】:2020-06-06 15:56:45
【问题描述】:

我想使用用户输入的名称上传多个文件。对于单个文件,我可以像这样更改名称

<form action="submit.php" method="post" class="form-validate" enctype="multipart/form-data">
    <div class="form-group">
        <label class="form-label" for="name">File Name</label>
        <input type="text" name="filename" class="form-control" required /> 
        <input type="file" name="file" required>
    </div>
    <button type="submit" name="add" class="btn btn-primary mt-1">Submit</button>
</form>

提交.php

if(isset($_POST['add'])) {
    $filename = $_POST['filename'];
    $extension = pathinfo($_FILES["file"]["name"], PATHINFO_EXTENSION);
    //insert query to db
    move_uploaded_file($_FILES["file"]["tmp_name"], "uploads/quotes/".$filename.".".$extension."");
}

这适用于单个图像。

但对于多张图片,我以这样的形式提供了 5 个文件上传选项

<div class="form-group">
    <label class="form-label" for="file2">File Name</label>
    <input type="text" name="filename2" class="form-control"  />
    <input type="file" name="file2">
</div>

<div class="form-group">
    <label class="form-label" for="file3">File Name</label>
    <input type="text" name="filename32" class="form-control"  />
    <input type="file" name="file3">
</div>

<div class="form-group">
    <label class="form-label" for="file4">File Name</label>
    <input type="text" name="filename4" class="form-control"  />
    <input type="file" name="file4">
</div>

<div class="form-group">
    <label class="form-label" for="file5">File Name</label>
    <input type="text" name="filename5" class="form-control"  />
    <input type="file" name="file5">
</div>

我想给出文件名,所以我使用这种方法而不是

<input type="file[]" multiple name="file">

但是这里的任何文件/文件名都可以为空,除了 1st upload 。那么我如何插入数据库并上传到所需的文件夹。 每次上传前我都需要检查文件名是否为空白/文件?请推荐

或者有什么办法可以在&lt;input type="file[]" multiple name="file"&gt;方法中更改每个文件的名称?

【问题讨论】:

  • 对每个文件字段使用相同的名称,对文本字段也使用相同的名称 - 使用 [] 样式语法。即name="file[]" & name="filename[]" - 提交表单时应该有一个索引数组,并且可以根据该索引访问文件和名称
  • 抱歉没听懂

标签: php html file-upload


【解决方案1】:

我尝试但显然失败的一个简单示例来解释名称。如果你运行它,你会看到类似下面的输出:

<?php
    error_reporting( E_ALL );
    ini_set( 'display_errors', 1 );

    function pre( $data ){
        printf('<pre>%s</pre>',print_r($data,true)); 
    }


    if( $_SERVER['REQUEST_METHOD']=='POST' ){
        ob_clean();
        pre($_POST);
        pre($_FILES);
        exit();
    }
?>
<!DOCTYPE html>
<html lang='en'>
    <head>
        <meta charset='utf-8' />
        <title></title>
    </head>
    <body>

        <form method='post' enctype='multipart/form-data'>
            <div class='form-group'>
                <label class='form-label'>File Name</label>
                <input type='text' name='filename[]' class='form-control'  />
                <input type='file' name='file[]'>
            </div>

            <div class='form-group'>
                <label class='form-label'>File Name</label>
                <input type='text' name='filename[]' class='form-control'  />
                <input type='file' name='file[]'>
            </div>

            <div class='form-group'>
                <label class='form-label'>File Name</label>
                <input type='text' name='filename[]' class='form-control'  />
                <input type='file' name='file[]'>
            </div>

            <div class='form-group'>
                <label class='form-label'>File Name</label>
                <input type='text' name='filename[]' class='form-control'  />
                <input type='file' name='file[]'>
            </div>

            <input type='submit' />

        </form>
    </body>
</html>

典型输出:

Array
(
    [filename] => Array
        (
            [0] => borat
            [1] => mouse
            [2] => thumbs
            [3] => suspense
        )

)
Array
(
    [file] => Array
        (
            [name] => Array
                (
                    [0] => 2480-1653-2.3558884.jpg.gallery.jpg
                    [1] => 84679948.jpg
                    [2] => CBUESFMUsAAM534.jpg
                    [3] => FullThrottle.jpg
                )

            [type] => Array
                (
                    [0] => image/jpeg
                    [1] => image/jpeg
                    [2] => image/jpeg
                    [3] => image/jpeg
                )

            [tmp_name] => Array
                (
                    [0] => C:\Program Files (x86)\PHP7.2\uploadtemp\php3719.tmp
                    [1] => C:\Program Files (x86)\PHP7.2\uploadtemp\php371A.tmp
                    [2] => C:\Program Files (x86)\PHP7.2\uploadtemp\php371B.tmp
                    [3] => C:\Program Files (x86)\PHP7.2\uploadtemp\php371C.tmp
                )

            [error] => Array
                (
                    [0] => 0
                    [1] => 0
                    [2] => 0
                    [3] => 0
                )

            [size] => Array
                (
                    [0] => 43124
                    [1] => 80518
                    [2] => 58358
                    [3] => 68344
                )

        )

)

您可以使用数组索引将文件链接到相应的文本

【讨论】:

  • 会尝试,但是如果任何一个文件名是空白但文件已上传,在这种情况下应该怎么做?以及如何跳过空白选项?
  • 如何处理数组本质上是您的选择,但您可以使用!empty( $var ) 进行测试以确定要做什么。您可以在 javascript 中做的一件事是将事件侦听器添加到每个 file 输入字段 - 如果它们发生变化(即:用户选择一个文件)然后确保前一个 text 字段具有 required 属性集或禁用提交按钮,直到文本字段有一些内容。诚然,这些步骤可以很容易地绕过,但合法用户可以帮助他们。
猜你喜欢
  • 2010-10-25
  • 1970-01-01
  • 2014-09-26
  • 1970-01-01
  • 2023-02-12
  • 1970-01-01
  • 2012-04-08
  • 1970-01-01
  • 2017-08-09
相关资源
最近更新 更多