Сохраненный файл PDF поврежден после загрузки, если пользователь заходит на мой сайт asp.net по ссылке электронной почты, но не поврежден после ручного входа? - PullRequest
0 голосов
/ 18 октября 2019

Мои извинения, если я пропустил все применимые ответы во время моего поиска.

Мой сайт asp.net отправляет пользователю электронное письмо со ссылкой. Trustwave добавляет некоторую информацию обертки вокруг ссылки перед доставкой электронной почты. Пользователь щелкает ссылку, аутентифицируется и перенаправляется на соответствующий контент. Если пользователь A переходит на docs.aspx, выбирает PDF и загружает, PDF поврежден, когда пользователь A открывает PDF. Сайт не создает PDF, он был загружен пользователем B.

Но , если пользователь A вручную просматривает сайт, аутентифицируется, переходит на docs.aspx и загружает PDFне поврежденВ обоих случаях используется одна и та же аутентификация, doc.aspx, code-behind и PDF.

Выполнение кода затруднительно, потому что я не знаю, как создать (защищенную Trustwave) ссылку электронной почты в моей тестовой среде.

Можете ли вы предложить дополнительные способы устранения неполадок? Файл PNG работал в обоих случаях, но я не хочу ограничивать типы файлов, которые пользователь B может загружать. Размер файла PDF составляет 11 КБ, и я использую современный веб-браузер Chrome. Приветствуются простые подробные ответы и примеры.

Вот метод doc.aspx:

For Each i As ListItem In Me.FileListbox.Items

    If i.Selected Then
        Response.Clear()
        Response.AppendHeader("Content-Disposition", "attachment; filename=" & i.Text)
        DownloadFile = Server.MapPath("documents") & i.Text

        Select Case Right(i.Text, 3)
            Case "doc"
                Response.ContentType = "application/msword"
            Case "jpg"
                Response.ContentType = "image/jpeg"
            Case "pdf"
                Response.ContentType = "application/pdf"
            Case "png"
                Response.ContentType = "image/png"
            Case "xls"
                Response.ContentType = "application/vnd.ms-excel"
            Case "zip"
                Response.ContentType = "application/zip"
            Case Else
                Response.ContentType = "application/octet-stream"
        End Select

        Response.TransmitFile(DownloadFile)
        Response.End()
    End If
Next

Ответы [ 2 ]

0 голосов
/ 21 октября 2019

Что-то пошло не так:

1-Никогда не закрывайте ответ, когда вы пишете или передаете что-то на него.

Response.End () вызывает прерывание потока, вместо этого используйте Response.Flush (). Однако следующий код является лучшим способом передачи файла в виде двоичных данных, а не в виде файла:

 Response.AddHeader("Content-Disposition", "attachment; filename=" & "put your filename here")
        Response.ContentType = "application/pdf"  

        'Read your file as binary data from your phisical path on server 
        Dim data() As Byte = My.Computer.FileSystem.ReadAllBytes("put your path of file here .pdf")

        ' And transmit those data as binary 
        Response.BinaryWrite(data)
        Response.Flush()
        Context.ApplicationInstance.CompleteRequest()


        'IMPORTANT: NEVER CLOSE Response whith Response.End and use Context.ApplicationInstance.CompleteRequest() instead
0 голосов
/ 19 октября 2019

Попробуйте заключить имя файла в кавычки в заголовке:

Response.AppendHeader("Content-Disposition", "attachment; filename=\"" + i.Text + "\"")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...