PHP - blueimp 自定义上传目录 - 重新加载时为空列表

PHP - blueimp custom upload directory - empty list on reload

我在 php 上使用 blueimp。在 HTML 中,我放置了一个隐藏的输入字段,以将 User_ID(登录后,来自数据库的用户 ID)作为 $_POST 值提交给上传处理程序。我使用 User_ID 值作为上传目录名称来将每个用户的文件彼此分开。

HTML:

    <form id="fileupload" action="server/php/index.php" method="POST" enctype="multipart/form-data">
    <input type="hidden" name="user_file_directory" id="user_file_directory" value="<?php echo $_SESSION['user_ID']; ?>">

index.php :

<?php
error_reporting(E_ALL | E_STRICT);
require('UploadHandler.php');
$user_filedirectory = $_POST['user_file_directory'];
$urlHolder = 'user_'.$user_filedirectory.'/';
$options = array(
                'upload_dir' => $_SERVER['DOCUMENT_ROOT'].'/ds-admin/server/php/'.$urlHolder,
                'upload_url' => './server/php/'.$urlHolder.'/',
);
if($urlHolder){
    $upload_handler = new UploadHandler($options , true , null);
}
?>

这可以很好地上传一些东西,上传后我可以看到缩略图,甚至可以放大它们。但是在重新加载 HTML 时,现有文件列表为空,文件仍然存在于服务器上的正确文件夹中。重新上传文件时,我只会看到新文件。

如何在 HTML 页面加载时检索自定义上传文件夹的内容?我必须在 HTML 的脚本部分设置下载文件目录吗?

问题是您检查 $_POST 数组中的文件,该数组只有在包含在 post 请求中时才具有值。现在,问题是当 post 发生时你没有将它们存储在某个地方:

if (isset($_POST['user_file_directory'])) {
    //store the values...
}

您可以使用数据库存储值,例如 MySQL,举个例子,或者您可以将文件列表存储到本地文件中,或者您可以存储在 $_SESSION变量,或者,如果你知道文件的位置,你甚至可以不存储它,那么你可以使用 scandir.

已找到解决方案!

我只是犯了错误,没有在 blueimp 的 index.php 内启动会话。在那之后,一切都像一个缺陷!每个用户根据他的用户 ID 从数据库(保存在会话中)获得自己的 up/Download 目录。

我的工作 index.php 现在看起来像这样:

<?php
       /* SESSION START IS IMPORTANT   ;) */
session_start();

/*
 * jQuery File Upload Plugin PHP Example 5.14
 * https://github.com/blueimp/jQuery-File-Upload
 *
 * Copyright 2010, Sebastian Tschan
 * https://blueimp.net
 *
 * Licensed under the MIT license:
 * http://www.opensource.org/licenses/MIT
 */

error_reporting(E_ALL | E_STRICT);
require('UploadHandler.php');
$user_filedirectory = $_SESSION['user_ID'];
$urlHolder = 'user_'.$user_filedirectory.'/';
$options = array(
                'upload_dir' => $_SERVER['DOCUMENT_ROOT'].'/ds-admin/server/php/'.$urlHolder,
                'upload_url' => './server/php/'.$urlHolder.'',
);
if($urlHolder){
    $upload_handler = new UploadHandler($options , true , null);
} 
?>

Lajos Arpad 给了我正确的提示:$_POST 不能用于列出目录内容,因为它的值只会在 Form-Action 之后传递...而那已经太晚了。

我知道这是一个较旧的 post,因此我的贡献可能不相关,但是这个 post 帮助我回答了一个问题,我想提供我对同一问题的具体解决方案。

我需要能够使用我之前生成的字符串设置文件夹的名称并作为 post 变量传递。该字符串存储在数据库中,并且是特定于客户端的。但在申请过程结束后将不会被使用。

除了使用会话 ID 作为文件夹名称外,上传器会做我们需要的一切。使用这个系统,一切都按预期工作,而会话变量存在。

无论如何,这是我所做的: 在 index.php 页面中,在上传系统的根目录下,我执行了以下操作:

$app_code = $_POST['app_code'];
session_id($app_code);
session_start();

索引页就是这些。

在ClassUploadHandler.php页面中,我只是设置了如下

function __construct($options = null, $initialize = true, $error_messages = null) {
    $this->response = array();
    $this->options = array(
        'script_url' => $this->get_full_url().'/'.basename($this->get_server_var('SCRIPT_NAME')),
        'upload_dir' => dirname($this->get_server_var('SCRIPT_FILENAME')).'/files/',
        'upload_url' => $this->get_full_url().'/files/',
        'user_dirs' => false,
        'mkdir_mode' => 0755,
        'param_name' => 'files',

至此

function __construct($options = null, $initialize = true, $error_messages = null) {
    $this->response = array();
    $this->options = array(
        'script_url' => $this->get_full_url().'/'.basename($this->get_server_var('SCRIPT_NAME')),
        'upload_dir' => dirname($this->get_server_var('SCRIPT_FILENAME')).'/files/',
        'upload_url' => $this->get_full_url().'/files/',
        'user_dirs' => true,
        'mkdir_mode' => 0755,
        'param_name' => 'files',

就是这样!

现在系统可以正常工作了。非常感谢!