-2

誰かがアップロードの進行状況を表示していないこのコードのエラーを見つけることができますか?

<form action="upload.php" method="post" enctype="multipart/form-data">
<center><p> <input type='file' id='upload_id' size='58' style='height: 30px; font-size: 18px' name='filename'></p>
<input type='image' src='<?php echo $menu_upload_button; ?>' onclick="function set() { f=document.getElementById('progress_iframe'); f.style.display='block'; f.src='uploadprogress.php?id=<?=$upload_id?>';} setTimeout(set);">
<iframe id="progress_iframe" src="" style="display:none;" scrolling="no" frameborder="0"></iframe>
</form>

入力からの関数は次のとおりです。

function set() { 
   f=document.getElementById('progress_iframe'); 
   f.style.display='block'; 
   f.src='uploadprogress.php?id=<?=$upload_id?>';
} 
setTimeout(set);

アップロード進行状況.php:

<META HTTP-EQUIV='REFRESH' CONTENT='1;URL=?id=<?=$_GET['id']?>'>
Upload progress:<br />
<?php
    if(!$_GET['id']) die;
    $info = uploadprogress_get_info($_GET['id']);
    $kbytes_total = round($info['bytes_total'] / 1024);
    $kbytes_uploaded = round($info['bytes_uploaded'] / 1024);
    echo $kbytes_uploaded.'/'.$kbytes_total.' KB';
?>

ありがとうございました。

4

1 に答える 1

1

手始めに、HTML で $_GET['id'] を使用して作り直すことをお勧めします。これは、セキュリティ侵害 (その URL にアクセスして厄介なものを渡す) のベクトルになるからです。おそらく、整数をチェックして、$_GET['id'] からの応答をサニタイズします。

また、同じサイトに接続している場合は、iframe を使用せずに ajax を介してページ上の要素をその場で更新できるため、iframe を削除します (これにより、より高速で効率的になります。毎回ページ全体をロードする必要はありません)。

ただし、このメソッドを保持すると、タイムアウト関数が終了しないため、javascript 関数がページで終了することはありません。次のような方法で行うことができます。

var timer = setTimeout(
clearTimeout(timer);

簡単に推測すると、uploadprogress.php は別のディレクトリにあり、完全な URL ではなく相対 URL を指定しています。それを切り替えてみてください(サーバーのhtdocs/foo/barディレクトリにあった場合は、/foo/bar/uploadprogress.phpに設定してください

最後に、setTimeout の時間パラメーターが必要です。それを含める必要があります。setFunction に console.log またはアラートを表示して、その関数が呼び出される頻度を確認します。

于 2013-01-13T23:49:00.030 に答える