如何管理用户上载的内容和存储

时间:2013-09-18 12:54:08

标签: php video amazon-s3 ffmpeg laravel-4

我正在使用PHP构建一个应用程序(Laravel 4框架),其帐户中的教师可以为学生创建数字课程。数字课程可包含以下内容:

  • 文字(来自表格的文字,.doc,.txt,.pdf等)
  • 图片(.gif,.png,.jpg等)
  • 视频(.avi,.mov,.mp4等)
  • 音频(.mp3等)

从表单输入的原始文本显然可以根据lesson_id存储在数据库中。所有其他内容格式都需要存储在某个地方,我可以管理和阅读文件,以及跟踪教师存储总量,因为我打算计算5GB,10GB等存储阈值。

在创建课程页面时,需要在保存课程之前将内容文件作为课程附件上传,以便教师可以直观地查看所有课程内容,然后点击“保存”立即创建课程。

以下是我的想法:

  1. 在创建课程之前,将所有课程文件附件上传到AWS S3到教师专用存储桶。将教师ID和日期时间添加到每个文件名中。

  2. 强制所有上传的视频/音频文件转换为.mp4,.mp3等,如果它们不是iDevice友好格式或超出文件大小限制。使用FFmpeg执行此操作。

  3. 保存并创建课程时,请根据数据库中的课程ID记录S3文件URL。

  4. 如果在特定时间段后尚未创建课程,请运行cron作业以检查上传的S3文件,无需课程并删除它们。

  5. 我不确定解决此问题的最佳方法是什么,因为用户上传的内容管理对我来说真的很新。

    您如何看待这种方法?你能推荐一种改进的或更好的方法来解决这个问题吗?

2 个答案:

答案 0 :(得分:0)

<?php
    // Set the max file size and upload path
    $maxFileSize = (100 * 1024);
    $uploadDir   = 'upload/';

    // Do not edit these values
    $showForm       = false;
    $formError      = false;
    $uploadFilePath = '';

    if (isset($_POST['submit'])) {
        // Check for upload errors
        if ($_FILES['file']['error'] > 0) {
            $formError = 'Error: ' . $_FILES['file']['error'];
        } else {
            $fileName     = $_FILES['file']['name'] ; // the name of the uploaded file
            $fileType     = $_FILES['file']['type'] ; // the type of the uploaded file
            $fileSize     = $_FILES['file']['size'] ; // the size in bytes of the uploaded file
            $tempLocation = $_FILES['file']['tmp_name']; // the temp file location

            // Check the file type
            if ( ! in_array($fileType, array('image/jpeg', 'image/png'))) {
                $formError = 'Invalid file type. Must be jpeg or png.';
            }
            // Check the file size
            elseif ($fileSize > $maxFileSize || $fileSize < 0) {
                $formError = 'Invalid file size. Must be between 1 and ' . $maxFileSize . ' kb.';
            }
            // Make sure the file does not exist
            elseif (file_exists($uploadDir . $fileName)) {
                $formError = 'The file "' . $fileName . '" already exists.';
            }
            // The file is valid so continue with the upload
            else {
                // Move the file from the tmp dir to the desired location
                move_uploaded_file($tempLocation, $uploadDir . $fileName);

                // Remember the complete upload file path
                $uploadFilePath = $uploadDir . $fileName;

                // Store the upload information in the database
                $c = mysql_connect('localhost','root','') or die (mysql_error());
                $d = mysql_select_db('datebase_name') or die(mysql_error());
                mysql_query("insert into table_name values('','$fileName','$fileType','$fileSize')") or die(mysql_error());
            }
        }
    } else {
        $showForm = true;
    }
?>
<!DOCTYPE html>
<html>
<head>
    <title>Hello!</title>
</head>
<body>
<?php
    if ($showForm) {
        if ($formError !== false) {
            echo '<p>' . $formError . '</p>';
        }
?>
    <form action="upload.php" method="post" enctype="multipart/form-data">
        <label for="file">Filename:</label>
        <input type="file" name="file" id="file"><br>
        <input type="submit" name="submit" value="Submit"><br>
    </form>
<?php
    } else {
        echo '<p>File stored at: ' . $uploadFilePath . '</p>';
    }
?>
</body>
</html>

此处文件将存储在名为“upload”的文件夹中,上传的文件大小和类型将保存在数据库中。

在上面的示例中,数据库表有4列(按此顺序):id,文件名,文件类型和文件大小。

注意:这是一个基本的例子。不要忘记改进文件验证以增强安全性。最好不向用户显示上传位置。在大多数情况下,“上传成功文件”等上传确认就足够了。

答案 1 :(得分:0)

简短回答 - 建议的方法很好。

答案很长......

我有类似的情况,我允许用户上传他们要宣传的商品图片。虽然我没有和你一样多的文件,也没有许多不同文件类型的复杂性,但原理是一样的......

在我的表单中,用户可以创建广告(在您的案例中为课程)我使用dropzone(dropzone.js),用户可以拖放图像。这会提示对我的Laravel API进行AJAX后调用,并立即上传文件(即在按下“提交”按钮之前)。他们上传到tmp目录。然后将此tmp目录的位置返回给浏览器,.js脚本将该位置存储在表单的隐藏字段中。当用户满意时,他点击提交并上传表单。此时,我处理表单并(除其他外)调整图像大小并将其移动到其永久位置,并将路径存储在数据库中。然后删除tmp目录。

然后我每天运行一次cron作业来清除任何仍然存在的tmp目录(这将来自用户放入图像,但之后不提交表单)。

我认为你的逻辑很好,我认为这可能有助于你了解别人如何处理工作流程。

祝你好运