0

PHP (Laravel 4 フレームワーク) でアプリを作成しています。このアプリでは、アカウントの教師が生徒用のデジタル レッスンを作成できます。デジタル レッスンには、次のコンテンツを含めることができます。

  • テキスト (フォーム、.doc、.txt、.pdf などのテキスト)
  • 画像 (.gif、.png、.jpg など)
  • ビデオ (.avi、.mov、.mp4 など)
  • オーディオ (.mp3 など)

フォームから入力された生のテキストは、明らかにlesson_idに対してDBに保存できます。他のすべてのコンテンツ形式は、ファイルを管理および読み取りできる場所に保存する必要があります。また、5 GB、10 GB などのストレージしきい値に対して請求する予定であるため、教師のストレージの合計を追跡する必要があります。

レッスンの作成ページでは、レッスンを保存する前にコンテンツ ファイルをレッスンの添付ファイルとしてアップロードする必要があります。これにより、教師はすべてのレッスン コンテンツを視覚的に確認し、[保存] をクリックしてレッスンをすぐに作成できます。

これが私が思いついたものです:

  1. レッスンが作成される前に、AWS S3 へのすべてのレッスン ファイルの添付ファイルを教師専用バケットにアップロードします。各ファイル名に教師 ID と日時を追加します。

  2. アップロードされたすべてのビデオ/オーディオ ファイルが、iDevice に適した形式でない場合、またはファイル サイズの制限を超えている場合は、強制的に .mp4、.mp3 などに変換されます。これを行うには、FFmpeg を使用します。

  3. レッスンを保存して作成したら、S3 ファイルの URL を DB のレッスン ID に対して記録します。

  4. 特定の期間が経過してもレッスンが作成されていない場合は、cron ジョブを実行して、アップロードされたレッスンのない S3 ファイルを確認し、それらを削除します。

ユーザーがアップロードしたコンテンツの管理は私にとって本当に初めてなので、この問題を解決する最善の方法は何なのかわかりません。

このアプローチについてどう思いますか?この問題を解決するための改善またはより良い方法をお勧めできますか?

4

2 に答える 2

0

簡単な答え - 提案されたアプローチは問題ありません。

長い答え...

同様の状況で、ユーザーが販売のために宣伝しているアイテムの画像をアップロードできるようにしています。私はあなたほど多くのファイルを持っていませんし、多くの異なるファイルタイプの複雑さもありませんが、原則は同じです...

ユーザーが広告を作成できるようにするフォーム (あなたの場合のレッスン) では、ユーザーが画像をドラッグ アンド ドロップできるドロップゾーン (dropzone.js) を使用します。これにより、Laravel API への AJAX post 呼び出しが促され、ファイルがすぐにアップロードされます (つまり、[送信] ボタンが押される前)。tmp ディレクトリにアップロードします。この tmp ディレクトリの場所がブラウザに返され、.js スクリプトがその場所をフォームの非表示フィールドに保存します。ユーザーが満足したら、送信をクリックすると、フォームがアップロードされます。この時点で、フォームを処理し、(とりわけ) 画像のサイズを変更し、それらを永続的な場所に移動します。パスはデータベースに保存されます。その後、tmp ディレクトリが削除されます。

次に、1 日に 1 回 cron ジョブを実行して、まだ存在する tmp ディレクトリをすべてクリアします (これは、ユーザーが画像をドロップしても、フォームを送信しない場合に発生します)。

あなたの論理は素晴らしいと思います。他の誰かがワークフローにどのように取り組んだかを聞くと役立つかもしれないと思いました.

幸運を

于 2013-09-18T14:32:51.510 に答える
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」という名前のフォルダーに保存され、アップロードされたファイルのサイズと種類がデータベースに保存されます。

上記の例では、データベース テーブルには、id、ファイル名、ファイル タイプ、ファイル サイズの 4 つの列が (この順序で) あります。

注: これは基本的な例です。セキュリティを強化するために、ファイルの検証を改善することを忘れないでください。また、ユーザーにアップロード場所を表示しない方がよいでしょう。ほとんどの場合、「ファイルが正常にアップロードされました」などのアップロード確認で十分です。

于 2013-09-18T13:50:47.273 に答える