使用JQuery检索物理文件,然后在浏览器中显示它

时间:2009-07-28 10:45:53

标签: asp.net ajax jquery

更新

  • 给出的大多数答案只是将返回的文档注入页面的html中的一些方法,但这似乎不起作用。如果您可以看到aspx代码在做什么之后可能会有所帮助:

    Try
    
        RenderDocument = Session("docSelected")
    
        If Not String.IsNullOrEmpty(Request.QueryString("download")) Then
            asDownload = CBool(Request.QueryString("download"))
        End If
    
        If RenderDocument IsNot Nothing Then
    
            Dim docBytes() As Byte
            Dim docExtension As String = ""
            Dim docFileSize As Long
    
            GetBytesAndExtension(docBytes, docExtension, docFileSize)
    
            If docBytes IsNot Nothing Then
    
                Dim ms As New MemoryStream(docBytes)
    
                With ms
    
                    Dim dataLengthToRead As Long = ms.Length
    
                    Dim blocksize As Integer
                    If dataLengthToRead >= 5000 Then
                        blocksize = 5000
                    Else
                        blocksize = dataLengthToRead
                    End If
    
                    Dim buffer(dataLengthToRead) As Byte
    
                    Response.Clear()
                    Response.ClearContent()
                    Response.ClearHeaders()
    
                    Response.BufferOutput = True
    
                    If asDownload = True Then
                        Response.AddHeader("Content-Disposition", "attachment; filename=" & RenderDocument.Name & "." & docExtension)
                    Else
                        Response.AddHeader("Content-Disposition", "inline; filename=" & RenderDocument.Name & "." & docExtension)
                    End If
    
                    Response.AddHeader("Content-Length", docFileSize.ToString())
    
                    Response.ContentType = "application/octet-stream"
    
                    While dataLengthToRead > 0 And Response.IsClientConnected
                        Dim lengthRead As Integer = ms.Read(buffer, 0, blocksize)
                        Response.OutputStream.Write(buffer, 0, lengthRead)
                        dataLengthToRead = dataLengthToRead - lengthRead
                    End While
    
                    Response.Flush()
                    Response.Close()
    
                End With
    
                Response.End()
    
            Else
    
                ResponseWithMessage("No Data")
    
            End If
    
        Else
    
            ResponseWithMessage("No Document")
    
        End If
    
    Catch ex As Exception
        ResponseWithMessage("ERROR: " & ex.Message)
    End Try
    
    • $ .post()函数的返回类型有什么意义?在我的代码中,我使用'html',但实际上它可能是一个正在返回的文件。

===================

原始问题:

场景是我想加载一个调用特定ASP.Net脚本的html页面,该脚本根据存储在会话中的一些数据返回一个文档。它的功能是无关紧要的,它本可以将文档作为http响应返回,但是它可能会根据发生的情况返回多个错误字符串中的一个。

html页面显示加载的gif图像,然后当返回文档或错误消息时,它需要适当地处理这些。

我可以让页面显示错误消息而没有问题,但我不知道如何最好地处理返回的文档请求,此时它只是打开一个新窗口并再次调用url,但是是笨重的,并再次调用整个文档检索过程(同步!),这违背了使用漂亮的ajax样式加载的目的。

这是我的JQuery代码:

$(document).ready(function(){
    $.post("displaydocument.aspx",null,function(data){

        if (data == 'No Document'){
            UpdateControls('No document has been specified to load');
        }

        if (data == 'No Data'){
            UpdateControls('No data was found for that document');
        }

        if (data.indexOf('ERROR',0) != -1) {
            UpdateControls(data);
        } 

        window.open("displaydocument.aspx","doc");
        window.close;

        }
    , "html");
});  

function UpdateControls(message){
    $("#txtInfo").html(message);
    $("#imgLoading").hide();
}

这是我的HTML:

<div style="text-align: center; font-family: 'Trebuchet MS';">
    <img alt="loading" src="/images/loader64.gif" id="imgLoading" />
    <br />
    <span style="font-size: small" id="txtInfo">Document is loading...</span>
</div>

您的帮助始终受到高度重视。

由于

3 个答案:

答案 0 :(得分:2)

已更新:我认为问题在于您尝试在一种方法中做太多。我将它分成两个操作:检查文档是否可用并下载文档。有你通过POST调用的方法(GET也可以工作,因为你没有传递任何数据)执行存在检查然后创建一个指向执行实际下载的文档处理程序URL的链接。将链接添加到页面并以编程方式单击它以调用下载处理程序。下载处理程序将包含您现有的代码,如果在不存在的文档上调用,则只返回错误页面。请注意,后者不会在正常操作中发生,但如果有人为下载的文档添加了书签并将其删除了。

此外,我很想使用JSON作为返回值而不是HTML来更容易处理错误。

$(function() {
    $.get('checkfordocument.aspx',null,function(data) {
        if (!data.Success) {
           UpdateControls(data.Message);
        }
        else {
           UpdateControls('');
           $("<a href='"
                + data.Url
                + "' target='_blank' class='docLink'>"
                + "Click here if your document does not start downloading</a>")
             .appendTo('#txtInfo')
             .trigger('click');
    }
    ,'json');
});

答案 1 :(得分:1)

打开窗口并使用JS设置内容,而不是向服务器发送另一个请求。

而不是

window.open("displaydocument.aspx","doc");

做类似的事情:

var win = window.open();
win.document.write(data);

这将设置新窗口的内容而不再次检索数据。

答案 2 :(得分:0)

我会创建一个web / wcf服务,如果存在某个文件,他将负责通知您。然后,您可以返回一个带有成功标志的简单json字符串,如果它失败了相关的错误消息。

这也节省了两次请求文件的需要,并且您还可以为将来的页面获得可重复使用的服务。项目。我知道应该缓存文档的响应,但是上述功能允许您向用户提供更大的错误消息通知。

$.getJson('fileExistsService.svc', { filename : someName }, function(data){

   if (data.success){
      //open document
      window.open("displaydocument.aspx","doc");
   }
   else {
     //display error to use
     //alert(data.errorMessage)
   }

})