0

マルチファイル アップローダー プラグインを使用しており、move_uploaded_file() を使用してサーバーに保存し、アップロードが成功した後にすべてのファイルの直接リンクをメールで送信したいと考えています。次の配列を取得しています...

Array
(
    [html5_uploader_0_tmpname] => p15rkfr6oogdt1ln91t0r4obrrh3.jpg
    [html5_uploader_0_name] => show_041.jpg
    [html5_uploader_0_status] => done
    [html5_uploader_1_tmpname] => p15rkfr8mb1plfu4q1giu3v01jl74.jpg
    [html5_uploader_1_name] => 23.jpg
    [html5_uploader_1_status] => done
    [html5_uploader_count] => 2
)

そして、次のコードを使用しています...

    $("#html5_uploader").pluploadQueue({
    // General settings
    runtimes : 'html5',
    url : 'upload.php',
    max_file_size : '10mb',
    chunk_size : '1mb',
    unique_names : true,
    filters : [
        {title : "Image files", extensions : "jpg,gif,png"},
        {title : "Zip files", extensions : "zip"}
    ],

    // Resize images on clientside if we can
    //resize : {width : 320, height : 240, quality : 90}
});

}

問題は、この配列の場合、 $_FILES["file"]["tmp_name"] と $_FILES["file"]["name"] の代わりに何を渡すかです。

4

2 に答える 2

3

更新された投稿をありがとう。

配列形式の要素 name を共有する1 つのフォームに複数のファイル アップロードがある場合、$_FILESすべて不安定になります。フォーム要素名とファイル情報の間に別のレイヤーを追加する代わりに、ファイル情報の後に別のレイヤーを追加します

それを視覚化する方が良いかもしれません:

array(
    'name' => array(
        0 => 'foo.gif',
        1 => 'bar.jpeg'
    ),
    'tmp_name' => array(
        0 => '/tmp/something',
        1 => '/tmp/else',
    )
);

あなたが期待したものではありませんよね?

今、あなたのコードはまったく無意味なことをしています。をループして$_POSTいますが、 を処理しています$_FILES。物事はそのようには機能しません。

投稿した元の配列をどこで取得しているのかわからないので、無視します

これ'file'が複数ファイルのアップロード フォーム要素の名前であると仮定して、配列を完全に再構築し$_FILESます。

$fixed_files = array();
foreach($_FILES['file'] as $expected => $unexpected) {
    foreach($unexpected as $index => $data)
        $fixed_files[$index][$expected] = $data;
}

(内部値が配列でない場合、このコード失敗する可能性があります。その他の修正オプションについては、PHP マニュアルの複数アップロードのページを参照してください$_FILES。)

そこには。$fixed_filesこれで、最初からできるはずだったようにループすることができます:

foreach($fixed_files as $uploaded) {
    $safe_name = preg_replace('/[^A-Za-z0-9_-\.]/', '', $uploaded["name"]);
    move_uploaded_file($uploaded["tmp_name"], "upload/" . $safe_name);
    $links[] = "upload/" . $safe_name;
}

以前のコードに新たに追加された点に注意してください -- $safe_name。配列の name 要素はユーザーからのものであり、信頼されるべきではありません。正規表現は、文字、数字、ダッシュ、アンダースコア、およびピリオド以外のものを取り除きます。

可能であれば、アップロードされたデータの検証も行う必要があります。 たとえば、画像を期待している場合は、ファイルが実際に画像であることを確認する必要があります。PHP 5.3 を使用している場合は、 を確認してくださいfinfo_file。これを使用してファイルの MIME タイプを取得し、それが作業可能なファイル タイプであることを確認できます。

于 2011-03-24T19:26:43.030 に答える
0

投稿後に受け取る出力は、表示している配列の元である $_POST に格納されます。

$_POST 配列出力をより有効に利用するには、まずフォーム ポスト出力を多次元配列/出力に変更する必要があります。

私がこれを行った方法は、plupload .js ファイルが html フォームをマルチパート フォームに構築する場所を変更することでした。@Charlesが言及したように、PHPマニュアルの次のPHPメソッド複数アップロードページを使用します。

$_POST データを多次元配列に分割する「name」タグ内の値の名前とカウントを囲む「[]」ブラケットを使用して、以下に編集した行の例。

    if (file.target_name) {
    inputHTML += '<input type="hidden" name="' + id + '[' + inputCount + '][tmpname]" value="' + plupload.xmlEncode(file.target_name) + '" />';
    }

    inputHTML += '<input type="hidden" name="' + id + '[' + inputCount + '][name]" value="' + plupload.xmlEncode(file.name) + '" />';
    inputHTML += '<input type="hidden" name="' + id + '[' + inputCount + '][status]" value="' + (file.status == plupload.DONE ? 'done' : 'failed') + '" />';

これは次のようになります。

配列
(
    [html5_uploader_0_tmpname] => p15rkfr6oogdt1ln91t0r4obrrh3.jpg
    [html5_uploader_0_name] => show_041.jpg
    [html5_uploader_0_status] => 完了
    [html5_uploader_1_tmpname] => p15rkfr8mb1plfu4q1giu3v01jl74.jpg
    [html5_uploader_1_name] => 23.jpg
    [html5_uploader_1_status] => 完了
    [html5_uploader_count] => 2
)

これに:

配列
  「アップローダー」=>
    配列
      0 =>
        配列
          'tmpname' => 文字列 'p15rkfr6oogdt1ln91t0r4obrrh3.jpg'
          '名前' => 文字列 'show_041.jpg'
          'ステータス' => 文字列 '完了'
      'count' => 文字列 '1'

次に、Plupload が「Upload.php」にある一時 (tmp) ファイルを保存する場所と、tmpname を使用し$_POST['tmpname']てファイルを移動できます。

    $targetDir = ini_get("upload_tmp_dir") . DIRECTORY_SEPARATOR . "plupload";
    move_uploaded_file($targetDir . $_POST['tmpname'], $destination);
于 2013-06-01T21:00:57.100 に答える