【问题标题】:How to Manage User Uploaded Content and Storage如何管理用户上传的内容和存储
【发布时间】:2014-11-06 20:12:29
【问题描述】:

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

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

从表单输入的原始文本显然可以根据课程 ID 存储在数据库中。所有其他内容格式都需要存储在某个地方,在那里我可以管理和读取文件,并跟踪教师的存储总量,因为我计划按 5GB、10GB 等存储阈值计费。

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

这是我想出的:

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

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

  3. 保存和创建课程后,将 S3 文件 URL 与数据库中的课程 ID 记录下来。

  4. 如果在特定时间段后仍未创建课程,请运行 cron 作业以检查上传的没有课程的 S3 文件并将其删除。

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

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

【问题讨论】:

  • 我不会通过操作文件名来管理文件,而是为文件创建一个新表,用于存储它们的 URL、它们属于哪个课程、它们的大小以及您想要的任何其他信息需要。这样,教师基本上可以共享文件,以及更容易从表格中收集信息,而不是自己检查文件。教师也可以在他们的课程中保存非现场文件,这样他们就不会占用太多空间。

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


【解决方案1】:

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

长答案...

我有类似的情况,我允许用户上传他们宣传出售的商品的图片。虽然我不会有你这么多文件,也不会有很多不同文件类型的复杂性,但原理是一样的……

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

然后我每天运行一次 cron 作业以清除任何仍然存在的 tmp 目录(这将由用户放入图像但随后未提交表单而引起)。

我认为您的逻辑很好,我认为这可能会帮助您了解其他人如何处理工作流程。

祝你好运

【讨论】:

    【解决方案2】:
    <?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、文件名、文件类型和文件大小。

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

    【讨论】:

      猜你喜欢
      • 2015-03-25
      • 2018-09-15
      • 2020-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-12
      • 1970-01-01
      • 2013-07-26
      相关资源
      最近更新 更多