nkphuc700 Ответов: 1

Почему браузеры на iPhone/iPad не могут загружать/просматривать файлы docx?


Мое веб-приложение позволяет конечным пользователям загружать и хранить документы в базе данных. И они тоже могут скачать эти документы из приложения.

Поведение загрузки документов настолько просто, что пользователь нажимает ссылку "загрузить этот документ" в графическом интерфейсе, я буду запрашивать двоичные данные документа из базы данных на основе входного параметра 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


Теперь мои пользователи загружают файл docx из моего веб-приложения.

- На iPad и iPhone: когда они нажимают на ссылку для загрузки этого docx, браузеры (Safari, Chrome) просто открывают новую пустую вкладку. И никакие файлы не загружаются, или даже если мы не можем просмотреть содержимое docx в этой новой вкладке.

- Но браузеры (Safari, Chrome) на MAC или ПК все еще работают нормально. Docx можно загрузить, как и ожидалось. (Когда мы нажмем на ссылку для загрузки docx, откроется новая вкладка. Затем появится диалоговое окно Сохранить файл, в котором вам будет предложено указать место для сохранения файла. После того, как мы сохраним Файл, Новая вкладка в браузере будет закрыта автоматически).

- Если мы переключимся на загрузку doc-файла (не docx), Safari/Chome на iPad/iPhone откроет новую вкладку и отобразит содержимое этого doc-файла (режим предварительного просмотра), и это не позволит нам загрузить этот файл, а просто позволит просмотреть файл.

Итак, мои вопросы здесь заключаются в том, почему браузеры на iPad/iPhone не могут загрузить docx? Можно ли вообще это сделать? Или это ожидаемое поведение iOS для iPad/iPhone для обеспечения безопасности конечного пользователя?

Пожалуйста, дайте мне совет! Большое спасибо!

Что я уже пробовал:

Я проверил и сравнил поведение браузеров (Safari, Chrome) между Android, iOS и Windows, как описано в разделе "опишите проблему" выше

1 Ответов

Рейтинг:
2

nkphuc700

Я нашел решение этого вопроса.
Просто верните правильный ContentType для docx, и проблема будет решена для iPhone и iPad
Зарегистрироваться в система Office 2007 файлы в формате MIME типы на серверах Майкрософт документы[^]