5

我有一个在 PHP 站点上工作的 jQuery File Upload 插件。

我想知道是否可以将文件上传到动态命名的子文件夹中,而不是全部进入同一个上传文件夹?

原因是我需要一个单独的文件夹来存放用户在网站上创建的每个“项目”中上传的文件。例如,当用户创建项目时,他们为该项目上传的所有内容都会进入 /uploads/{$project_uid}/{$file_name}

我希望我已经正确地解释了自己,如果有人能在这里帮助我,我将不胜感激。

谢谢!

4

1 回答 1

3

首先,显而易见的是:出于明显的安全原因,您实际上不能 使用 JavaScript/jQuery/jWhateverPlugin(即从客户端)设置上传目的地。

但是您可以将信息传递给服务器端引擎(在您的情况下是 PHP),它可以使用它来管理上传的实际存储。

存在各种工具包可以帮助您,例如您最初开始使用的 blueimp 的jQuery File Upload或UploadifyBenno首次推广并似乎满足了您的要求。

因此,您需要做的是自定义客户端大小和服务器端脚本,以实现传递目录变量并使用它们来定义存储位置。

很大程度上基于Uploadify 文档,并使用您的project_uid变量,这看起来像这样:

在客户端(JavaScript + jQuery + Uploadify):

var project_uid;
// populate project_uid according to your needs and implementation
// befor using uploadify

$('#file_upload').uploadify({
    'method'   : 'post',

    // pass your variable to the server
    'formData' : { 'project_uid' : project_uid },

    // optional "on success" callback
    'onUploadSuccess' : function(file, data, response) { 
        alert('The file was saved to: ' + data);
    }
});

在服务器端(PHP + Uploadify):

// Set $someVar to 'someValue'
$untrustedProjectUid = $_POST['project_uid'];

// Remember to check heavily the untrusted received variable.
// Let's pretend you checked it, it passe your tests, so you
// initialized a trusted var with it
$trustedProjectUid = ensureSecure( $untrustedProjectUid );

$targetFolder = '/uploads/' . $trustedProjectUid . '/' ; // Relative to the root


if (!empty($_FILES)) {
    $tempFile = $_FILES['Filedata']['tmp_name'];
    $targetPath = $_SERVER['DOCUMENT_ROOT'] . $targetFolder;
    $targetFile = rtrim($targetPath,'/') . '/' . $_FILES['Filedata']['name'];

    // Validate the file type
    $fileTypes = array('jpg','jpeg','gif','png'); // Put you allowed file extensions here
    $fileParts = pathinfo($_FILES['Filedata']['name']);

    if (in_array($fileParts['extension'],$fileTypes)) {
        move_uploaded_file($tempFile,$targetFile);
        echo $targetFolder . '/' . $_FILES['Filedata']['name'];
    } else {
        echo 'Invalid file type.';
    }
} 
于 2012-06-18T10:43:09.053 回答