ASP .NET PageMethods - 文件上传

时间:2011-07-14 18:32:31

标签: asp.net asp.net-ajax

我正在尝试创建一个ajaxy文件上传。

这是asp代码:

<input type="file" id="supportingDocs" runat="server"/>
<input type="button" id="uploadBtn" onclick="upload();" value="Upload"/>

这是javascript:

function upload()
{
    PageMethods.uploadFile($get('supportingDocs').value, onSucceed, onFail);
}

以下是相关的C#代码:

[WebMethod]
[ScriptMethod]
public static string uploadFile(string files) {
    HttpRequest request = HttpContext.Current.Request
    ........
}

我想要的是来自请求的HttpFilesCollection是空的。我知道PageMethods不遵循正常的asp .net生命周期。但是,在调试中单步执行代码时查看HttpRequest对象,我发现请求中的其他所有内容都存在,但“Files”属性为空。我可能在这里遗漏了一些东西,这种上传文件的方法甚至可能都不可能。

4 个答案:

答案 0 :(得分:0)

你总是可以使用AjaxControlToolkit提供的那个,即ASyncFileUpload

答案 1 :(得分:0)

您可以考虑使用jquery插件:http://www.uploadify.com/

文件上传控件的工作原理是将发布请求发送回带有文件内容的服务器。这就是文件上传的构建方式。话虽如此,我不确定所有这些文件上传插件的内部工作方式是如何运行的,但是即使使用ASP.NET AJAX服务也是开箱即用的,考虑一些其他服务可能更好。

如果您想使用某项服务,可以尝试使用Sys.Net.WebServiceProxy.invoke方法,该方法可让您控制帖子,将表单数据序列化以发布到服务器。再说一次,理论上,我并不是100%确定这一切是如何通过AJAX实现的。

HTH。

答案 2 :(得分:0)

如果您要上传没有完整回发的文件,请尝试SWFUpload。它有一个非常漂亮的文件浏览器选项和其他功能,不像ASP.NET AJAX AsyncFileUpload看起来非常有限。

SWFUpload演示:http://demo.swfupload.org

一个流行的jquery选项是uploadify,请参阅this stackoverflow post

我没有能够在没有闪存的情况下使异步文件上传工作。

<强>更新

This post声称AsyncFileUpload不使用flash,因此这可能比uploadify和SWFUpload更有优势。

答案 3 :(得分:0)

好的,所以我最终使用了asp异步上传和页面方法。

AsyncFileUpload在实际保存服务器上的文件时运行良好,但我仍然需要运行一些服务器端代码来写出数据库,并列出上传到服务器的当前文件。不幸的是,由于上传后没有回发,因此您更改客户端的任何内容都不会被渲染。所以我只是将OnClientUploadComplete设置为使用页面方法的JS函数。

ASP代码:

<asp:AsyncFileUpload ID="asyncFileUpload" runat="server"  OnUploadedComplete="uploadFile" OnClientUploadComplete="showUploadedFiles" ThrobberID="uploading"/>

使用Javascript:

    function showUploadedFiles()
    {
        PageMethods.getUploadedFiles(onSucceed, onFail);
    }

    function deleteDoc(docId)
    {
        PageMethods.deleteDocument(docId, onSucceed, onFail);
    }

    function onSucceed(result, userContext, methodName)
    {
        $get('uploadedFiles').innerHTML = result;
    }

    function onFail(error, userContext, methodName)
    {
        $get('uploadedFiles').innerHTML = "<p style='color: red;'>AJAX Error!</p>";
    }