用户反复尝试上载无效文件类型时,站点崩溃

时间:2014-04-22 20:14:19

标签: php http tcp

我试图了解错误......

我有一个允许用户上传CSV的网络应用。如果文件类型不是CSV,则不会发生任何事情,页面只显示"无效的文件类型。"

如果用户尝试上传无效的文件类型并反复单击触发处理上传的PHP文件的按钮,则PHP文件最终会无响应,并且网站崩溃时出现以下错误:

"tcp_error: The Web Server may be down, too busy, or experiencing other problems preventing it from responding to requests. You may wish to try again at a later time"

我认为这与它是一个持久的HTTP连接以及它被请求淹没的事实有关吗?

如果用户反复尝试上传无效的文件类型,我想知道这个的确切来源以及避免崩溃的最佳修复方法。

HTML摘录:

<script type="text/javascript">
        function stopUpload(success){
              console.log(success);
              var csv1 = success['csv1'];
              var csv2 = success['csv2'];
              var csv3 = success['csv3'];
              var csv4 = success['csv4'];
              var csvError = success['error'];
              var id = success['id'];
              $('.js-wf-error').text(csvError);
              if (!csvError) {
                runWF(id, csv1, csv2, csv3, csv4);
              }
        }
</script>

<iframe id="upload_target" name="upload_target" src="#" style="width:0;height:0;border:0px solid

<form id="wf-form" class="js-wf-form" method="post" action="wf/csv-upload.php" enctype="multipart/form-data" target="upload_target">
    <input type="file" name="csv1" value="" class="text ui-widget-content ui-corner-all csv-upload" />
    <input type="file" name="csv2" value="" class="text ui-widget-content ui-corner-all csv-upload" />
    <input type="file" name="csv3" value="" class="text ui-widget-content ui-corner-all csv-upload" />
    <input type="file" name="csv4" value="" class="text ui-widget-content ui-corner-all csv-upload" />
  <a  href="#" onclick="$(this).closest('form').submit(); return false;" type="submit"class="button redButton largeButton run-wf-button">Run Walking Farm</a>
</form>

CSV-upload.php的

(...upload handling...)
?>
<script language="javascript" type="text/javascript">
    window.top.window.stopUpload(<?php print json_encode($returnData); ?>);
</script>  

3 个答案:

答案 0 :(得分:2)

尝试给它一个镜头。它可以工作,但不能保证: 通过html表单上传文件时,可能需要几秒钟才能成功上载表单并显示响应页面(PHP)。人们可能会感到不耐烦,并多次单击“上传”按钮,这可能导致重复的表单提交或上传。通常它确实是一个问题&amp;你可能希望防止这种情况发生。 您可以使用javascript来处理它: 第一步是为您的提交按钮提供唯一ID,例如id =&#34; myButton&#34;:

<input type="submit" value="Submit" id="myButton" />

第二步(也是最后一步)是给标签提供两个Javascript命令。第一个将告诉浏览器在提交表单后禁用提交按钮,第二个将更改按钮文本以让用户了解发生了什么。这是要添加到表单标记的代码:

onsubmit="document.getElementById('myButton').disabled=true;

document.getElementById('myButton').value='Uploading to  server, please wait...';"

您的表单标签看起来像是:

<form action="wf/cs-vupload.php" method="post"
onsubmit="document.getElementById('myButton').disabled=true;
document.getElementById('myButton').value='Uploading to  server,please wait...';"

>

那就是它。这个技巧应该适用于大多数现代浏览器(IE 5 +,FireFox,Opera,...)。

还有一种使用Cookie的方法,这些快速修复可以防止多次提交表单。请尝试以下链接:http://myphpform.com/prevent-multiple-form-submissions.php

是的,我错过了一些事情,知道它是否属实。

答案 1 :(得分:2)

我觉得浏览器超时是因为你的服务器忙于处理所有其他(上传)请求。

有一个名为one()的jQuery方法只执行一次事件,这应该可以很好地解决这个问题。

例如:

<form id="wf-form" class="js-wf-form" method="post" action="wf/csv-upload.php" enctype="multipart/form-data" target="upload_target">
    <input type="file" name="csv1" value="" class="text ui-widget-content ui-corner-all csv-upload" />
    <input type="file" name="csv2" value="" class="text ui-widget-content ui-corner-all csv-upload" />
    <input type="file" name="csv3" value="" class="text ui-widget-content ui-corner-all csv-upload" />
    <input type="file" name="csv4" value="" class="text ui-widget-content ui-corner-all csv-upload" />
  <a  href="#" id="submit_link" type="submit"class="button redButton largeButton run-wf-button">Run Walking Farm</a>
</form>

<script type="text/javascript">
    $("#submit_link").one( "click", function() {
        $("#wf-form").submit();
    });
</script>

为了完整起见:如果它不是一个链接而是一个按钮,你可以简单地在onClick事件中禁用提交按钮(在submit()之后),以禁止多次提交文件。

答案 2 :(得分:1)

您可以将XMLHttpRequest Javascript类用于ajax上传文件,将FormData用于表单类。

<iframe id="upload_target" name="upload_target" src="#" style="width:0;height:0;border:0px solid #fff;"></iframe>

    <form id="wf-form" class="js-wf-form" method="post" action="wf/csv-upload.php" enctype="multipart/form-data" target="upload_target">
        <input type="file" name="csv1" value="" class="text ui-widget-content ui-corner-all csv-upload" />
        <input type="file" name="csv2" value="" class="text ui-widget-content ui-corner-all csv-upload" />
        <input type="file" name="csv3" value="" class="text ui-widget-content ui-corner-all csv-upload" />
        <input type="file" name="csv4" value="" class="text ui-widget-content ui-corner-all csv-upload" />
<input type="hidden" value="1000000" name="MAX_FILE_SIZE">
      <a  href="#" onclick="fcsvUpload(); return false;" type="submit"class="button redButton largeButton run-wf-button">Run Walking Farm</a>
    </form>

    <script type="text/javascript">

         function fcsvUpload(){
            var oData = new FormData(document.getElementById("wf-form"));
            var result = true;



            var oReq = new XMLHttpRequest();
            oReq.open("POST", "wf/csv-upload.php", false);

            oReq.send(oData);

            if (oReq.status === 200) {
                return result;
            } else {
                return result;
            }
        });
    </script>

你在iframe的html行中有错误。 iframe标签未关闭。也许是因为它不起作用。看:

<iframe id="upload_target" name="upload_target" src="#" style="width:0;height:0;border:0px solid