【问题标题】:jQuery .submit() upload form display response returned by Slim PHPSlim PHP 返回的jQuery .submit() 上传表单显示响应
【发布时间】:2012-08-10 22:31:52
【问题描述】:

我有一个用于将文件上传到服务器的 html 表单。为简洁起见,我只展示了基本的部分

 <form id='uploadform' method='post' enctype='multipart/form-data' action='index.php/upload'>
   <input name='myFile' id='myFile' type='file'/>
 </form>
 <input type='button' id='upload' value='Upload'/>
 <div id='response'></div>

我使用 jQuery.submit() 提交表单:

 $('#uploadform').submit();

业务逻辑是 Slim PHP : $app->post('/upload', 'uploadFile'); ....

   function uploadFile(){
       try{
           // if success uploading
           $app->redirect('/main-page');

       }catch(Exception $e){
           // if error 
           echo $e->getMessage();

       }
    }

问题:如果由于某种原因上传失败,则抛出异常,用户被带到 PHP 错误页面。如果上传无异常完成,应用程序将被重定向到主页。

需要的是:如果上传成功,应用程序应该像现在一样重定向到主页...但是如果抛出任何异常,而不是转到 PHP 错误页面,应用程序应停留在上传页面上,并且 id = 'response' 应显示异常。

有没有可能用 jQuery submit() 做这样的事情:

     $('#uploadform').submit(function(response){
           $('response').html(response);
     });

??????

我知道 JQuery 上传文件插件会让生活更轻松...但这不是我的选择...

感谢您的指点!

可以吗

【问题讨论】:

  • 为什么你不能使用其他人的插件,而必须自己编写?另外,你读过这个吗? stackoverflow.com/questions/166221/…
  • 你知道异常究竟是什么时候发生的吗?如果您知道可以使用 throw() 来强制您的 catch 块执行代码。我从未与slim 合作过,所以看看这个提示是否对你有帮助。如果我错了请忽略!!
  • 真的是异常,不是php错误吗?如果是这样,catch 块将不会被触发,您也不会收到异常消息。
  • @Nal 重新启动轮子的动机有很多:教育目的,受许可证或主管限制,使用的平台与插件不兼容或需要大量更改
  • 抱歉,伙计们回复晚了。感谢弗拉德的回答...我不能使用插件,因为环境确实受到限制...这迫使我重写很多 API 喜欢的东西jQuery UI 已经有了

标签: php jquery submit slim


【解决方案1】:

这里需要使用 ajax 是使用 ajax 上传文件的示例

Sending multipart/formdata with jQuery.ajax

不使用 ajax,您可以重定向回用户并通过 GET 方法发送错误文本并将此文本放入响应标签中

【讨论】:

  • 谢谢!..您发布的链接很有帮助。我仍在评估您的解决方案。您的解决方案可能有效,因为我认为 ajax 上传可以解决我的问题:当出现异常时,我可以绕过 Slim Framework 重定向(我知道它有点草率)到主页......同时我正在专门为 IE8 构建这个应用程序......所以我希望 IE8 支持 FormData 类
  • 我尝试过使用 Chrome、Firefox 和 IE8。它适用于 Chrome 和 Firefox……但不适用于 IE8(不过并不奇怪)……感谢您的回答!我会把这个给你
【解决方案2】:

您可以选择将“提交”发送到“iframe”,然后使用“js”获取响应。在 PHP 中,您发送一条消息,然后在“JS”中进行解释。

HTML:

<form id="uploadform" method="post" enctype="multipart/form-data" action="index.php/upload" target="uploadformResponse">
   <input name='myFile' id='myFile' type='file'/>
</form>
<input type='button' id='upload' value='Upload'/>
<div id='response'></div>
<div style="display:none;">
    <iframe name="uploadformResponse" id="uploadformResponse"></iframe>
</div>

Javascript:

var runSubmitForm = function() {

   var 
      $iframe = $('#uploadformResponse'),
      fnLoadIframe = function(event) {
         $iframe.unbind('load');
         var 
             response = $iframe.contents(),
             aresponse = response.split('|');  

         console.log('debug respnse', response);

         if (aresponse.length != 2) {
            $('#response').html("Error I ???");
         }

         if (aresponse[0] == '1') {
             window.location = aresponse[1];
         }
         else if (aresponse[0] == '0') {
            $('#response').html(aresponse[1]);
         }
         else {
            $('#response').html("Error II ???");
         }
      };

   $iframe.bind('load', fnLoadIframe);
   $('#uploadform').submit();
};

PHP:

function uploadFile(){
   try{
      // if success uploading
      echo '1|/main-page';
   } catch(Exception $e) {
      // if error 
      echo '0|' . $e->getMessage();
   }
   exit; // optional
}

【讨论】:

  • 感谢您的回答,我会根据您的指示工作并相应地选择答案。
【解决方案3】:

我想这就是你要找的东西

html代码:

<form id='uploadform' method='post' enctype='multipart/form-data' action='index.php/upload' target="hiddeniframe">
    <input name='myFile' id='myFile' type='file'/>
</form>
<iframe name="hiddeniframe" id="hiddeniframe" style="display: none"></iframe>
<input type='button' id='upload' value='Upload'/>
<div id='response'></div>

我添加了一个隐藏的 iframe,并将表单的目标设为 iframe 的 id。这将使表单提交到 iframe,因此整个页面不会重新加载

javascript代码:

<script type="text/javascript">
    window.showUploadError = function(error) {
        $('#response').html(error);
    };


     $('#uploadform').submit();
</script>

我添加了一个名为 showUploadError 的全局函数,如果出现错误,它将从 php 上传函数中调用

php代码

<?php
    function uploadFile(){
        try{
            // if success uploading
            ?>
            <script type="text/javascript">
                parent.location.href = '/main-page'
            </script>
            <?php 
            die();
        }catch(Exception $e){
        // if error 
        ?>
            <script type="text/javascript">
                parent.showUploadError('Upload failed');
            </script>
        <?php
   }
}

如果上传成功,我们会输出一些javascript代码,将父页面(主页面)重定向到新位置,否则会调用showUploadError javascript函数。

请记住,这是一个粗略的例子,我还没有测试过。

【讨论】:

  • 感谢您的回答,我会根据您的指示工作并相应地选择答案。
【解决方案4】:

我过去也遇到过类似的问题,我想出的是使用一个不可见的 iframe 来发布文件上传并返回 html 结果,希望这会有所帮助!

【讨论】:

  • 您能否详细说明您如何能够冒泡异常,这样如果上传失败,应用程序将保持在同一页面并显示错误。对我来说,Slim 会重定向到自己的错误页面,以防出现任何异常。我不想向用户显示任何 Slim Exceptions
猜你喜欢
  • 1970-01-01
  • 2012-12-18
  • 1970-01-01
  • 2014-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多