我的Web应用程序允许最终用户上传文档并将其存储在数据库中。他们也可以从应用程序下载该文档。
下载文档的行为是如此简单,以至于用户在GUI上单击“下载此文档”链接,我将根据客户端请求的输入documentID参数从数据库中查询文档二进制数据。之后,我将字节数据发送给客户端。
让我们看看我的代码。
这是我从客户端接收下载文档请求的功能。
Sub ProcessRequest(ByVal context As HttpContext) Implements IHttpHandler.ProcessRequest
Dim DocumentID As String = getParameter("DocumentID", context)
DocumentWrapper.Download(DocumentID)
context.Response.Write("<script language=javascript>window.open('','_self','');window.close();</script>")
End Sub
这是我查询二进制数据并将其响应到客户端的功能。
Public Shared Sub Download(ByVal documentId As String)
Dim contentType As String = String.Empty
Dim bytes As Byte() = Nothing
Dim docItem As DocumentEntity = New DocumentEntity()
If (documentId IsNot Nothing) Then
docItem = New DocumentDao().SelectByDocumentID(documentId)
If Not String.IsNullOrEmpty(docItem.auto_key.Trim()) Then
HttpContext.Current.Response.Clear()
HttpContext.Current.Response.ClearContent()
HttpContext.Current.Response.ClearHeaders()
HttpContext.Current.Response.ContentType = GetContentType(docItem.fileexten)
HttpContext.Current.Response.AppendHeader("Content-Disposition", "attachment; filename=" & docItem.filename.Trim & "." & docItem.fileexten.Trim)
If (docItem.document IsNot Nothing) AndAlso (docItem.document IsNot System.DBNull.Value) Then
HttpContext.Current.Response.BinaryWrite(docItem.document)
End If
HttpContext.Current.Response.Flush()
HttpContext.Current.Response.Close()
HttpContext.Current.Response.End()
End If
End If
End Sub
End Class
现在,我的用户从我的Web应用程序下载docx文件。
在iPad和iPhone上:当他们单击链接下载该docx时,浏览器(Safari,Chrome)只需打开一个新的空白标签即可。而且没有文件下载,即使我们无法在该新标签页中预览docx内容。
但是,MAC或PC上的浏览器(Safari,Chrome)仍然可以正常工作。 docx可以按预期下载。 (当我们单击链接下载docx时,将打开一个新标签。然后,将出现一个“保存文件”对话框,询问您保存文件的位置。保存文件后,浏览器上的新标签将会自动关闭)。
如果我们切换为下载 doc 文件(而非docx),则iPad / iPhone上的Safari / Chome将打开一个新标签,并显示该 doc 文件的内容文件(预览模式),并且不允许我们下载该文件,而只能预览该文件。
所以,我的问题是,为什么iPad / iPhone上的浏览器无法下载docx?反正有这样做吗?还是这可能是iOS为iPad / iPhone保护最终用户的行为?
答案 0 :(得分:0)
我找到了这个问题的解决方案。只需为docx返回正确的ContentType https://docs.microsoft.com/en-us/previous-versions/office/office-2007-resource-kit/ee309278(v=office.12)