jQuery表单插件文件上传

7

我有一个关于jQuery表单插件的问题。 我尝试异步上传文件,但它不会提交表单。 HTML标记和JavaScript代码如下:

<form id="fileUploadForm" method="post" action="Default.aspx" enctype="multipart/form-data">
<input type="text" name="filename" />
<input type="file" id="postedFile" name="postedFile" />
<input type="button" value="Submit" onclick="UploadFile();" />
</form>

$(document).ready(function() {

        $('#fileUploadForm').ajaxForm();            
    });

function UploadFile() {

        var options =
        {                
            url:"Default.aspx",                
            beforeSend: ShowRequest,
            success: SubmitSuccesfull,
            error:AjaxError                               
        };            
        $("#fileUploadForm").ajaxSubmit(options);
        return false;
    }. 

我有另一个测试表单,它只有一个文本框,它可以正常工作。当我注释掉input type="file"这一行时,上面的表单也可以正常工作。那么input type file有什么问题呢?有任何想法吗?

1个回答

8
简而言之:
<input type="file" />

无法通过 AJAX 提交,必须完全回传。如果您想要 AJAX 风格的行为,传统上会使用 iFrame 来实现。我使用了一些解决方案,但不知道您所用的平台,SWFUpload 通常是一个不错的选择。

这里有一个完整的文档示例:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title></title>
    <script type="text/javascript" src="Javascript/jquery-1.3.2.js"></script>
    <script type="text/javascript" src="Javascript/jquery.form.js"></script>
    <script type="text/javascript">
        $(function() {            
          $('#fileUploadForm').ajaxForm({                 
            beforeSubmit: ShowRequest,
            success: SubmitSuccesful,
            error: AjaxError                               
          });                                    
        });            

        function ShowRequest(formData, jqForm, options) {
          var queryString = $.param(formData);
          alert('BeforeSend method: \n\nAbout to submit: \n\n' + queryString);
          return true;
        }

        function AjaxError() {
          alert("An AJAX error occured.");
        }

        function SubmitSuccesful(responseText, statusText) {        
          alert("SuccesMethod:\n\n" + responseText);
        }    
    </script>
</head>
<body>
    <form id="fileUploadForm" method="POST" action="Default.aspx" enctype="multipart/form-data">
      <input type="text" name="filename" />
      <input type="file" id="postedFile" name="postedFile" />
      <input type="submit" value="Submit" />
    </form>
</body>
</html>

2
感谢您的回应,您能否检查下面的链接: http://jquery.malsup.com/form/#file-upload 我有误解吗? - mehmet6parmak
@mehmet6parmak - 添加了上面的替代方案,请尝试一下,看看是否仍然存在问题。您是否使用FireBug或其他工具查看是否有任何操作/错误发生? - Nick Craver
@mehmet6parmak - 有时间看一下吗?你的主要问题是beforeSend在这种情况下干扰了表单的行为,将其更改为beforeSubmit(已更新答案!)此外,如果您像上面那样将按钮类型更改为type="submit",它将自动调用ajaxForm行为。我还将代码压缩了一些,以显示更短的方式,但无论哪种方式,都存在相同的beforeSend问题。希望这能帮助到您! - Nick Craver
你好Nick,请问为什么我不能将 dataType: 'json' 添加到选项列表中呢?它总是报错。谢谢。 - q0987
他正在谈论 jQuery From Plugin,它完全能够处理文件上传。在我看来,使用Flash来处理上传是一个糟糕的决定,尤其是现在Flash已经被弃用了。 - Pere
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接