5

ユーザーがFileUploadControlを使用してサーバーにファイルをアップロードし、このコードでそのイベントを処理できるページを作成しました

Sub SaveAttachment()
    Dim root As String = "C:\temp\"
    Dim filename As String = FileUpload1.FileName
    Dim SaveName As String = root & filename
    FileUpload1.SaveAs(SaveName)
End Sub

それはうまくいきました、私はファイルがアップロードされるのを見ることができました、そしてファイルの内容は無傷です(ユーザーがアップロードしたファイルの正確に複製されたコピー)。

ここで、ファイルをユーザーにダウンロードして戻すために(後で)、Request.Parameter( "file")からファイル名を読み取り、そのファイルをフェッチしてユーザーにダウンロードする別のページを作成しました。ASP部分でのダウンロードを処理するためにDownload.aspxページを作成しました(コードビハインドは使用されていません)。

<%@ Import Namespace="System.IO"%>
<script language="VB" runat="server">
Sub Page_Load(sender As Object, e As EventArgs)

        Dim root As String = "C:\temp\"
        Dim filepath As String = Request.Params("file")
        If Not filepath Is Nothing Then
            filepath = root & filepath
            If File.Exists(filepath) And filepath.StartsWith(root) Then
                Dim filename As String = Path.GetFileName(filepath)
                Response.Clear()
                Response.ContentType = "application/octet-stream"
                Response.AddHeader("Content-Disposition", _
                  "attachment; filename=""" & filename & """")
                Response.Flush()
                Response.WriteFile(filepath)
            End If
        End If

End Sub
</script>
<form id="form1" runat="server">
<asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
</form>

画像ファイルをアップロードしてから再度ダウンロードしてみましたが、問題なく動作しました。ただし、テキストファイルをアップロードした場合にのみ、そのファイルのコンテンツにHTMLコンテンツが追加されます。

これが私がアップロードしたサンプルファイルです アップロード前の元のファイル

Here is my sample text file

It consists of 3 lines only

そして、これが私がそれをダウンロードして戻したときのファイルです サーバーからダウンロードしたときの同じファイル

Here is my sample text file

It consists of 3 lines only
<form name="form1" method="post" action="FileDownload.aspx?file=sample_file.txt" id="form1">
<div>
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwULLTE5NTU5ODQyNTBkZNCYbOVZJDRUAOnIppQYkwHUSlb0" />
</div>

<span id="Label1">Label</span>
</form>

サーバー上のファイルに移動して開き、追加のHTMLコンテンツがそこにあることを確認しましたが、前述のように、ファイルは完全にアップロードされました。ダウンロードされた場合にのみ、追加されたHTMLのものが含まれます。

私が間違っているのは何ですか?この追加のHTMLコードをなくすにはどうすればよいですか?この問題がテキストファイルにのみ影響し、画像、EXE、XLS、DOCなどには影響しないのはなぜですか?

4

3 に答える 3

3

Response.End()後に電話して応答を終了してください。Response.WriteFile(filepath)そうしないと、フォームがストリームに追加されてクライアントに送信されます。

他のファイルにも影響しますが、ほとんどの場合、ファイルの最後でガベージとしてのみ表示され、それぞれのアプリケーションによって無視されます。

于 2012-07-21T07:57:58.067 に答える
2

使用するのは安全ではありません。デバッグしてcatchブロックで確認した場合Response.End()、常にSystem.Threading.ThreadAbortException:..が返されます。

別の方法..代わりに次を使用してください...

Response.Flush();
Response.SuppressContent = true;
Response.WriteFile(filepath);
HttpContext.Current.ApplicationInstance.CompleteRequest();
于 2013-12-02T12:31:07.000 に答える
2

Response.redirectが例外をスローしました。Shoaibの答えは私を近づけましたが、有効なファイルの内容を含むすべてを抑制しました。私にとってうまくいったのは、ステートメントを次のように並べ替えることでした。

 Response.ContentType = ContentType
 Response.AppendHeader("Content-Disposition", "attachment; filename=" & originalFileName)
 Response.WriteFile(filePath)
 Response.Flush()
 Response.SuppressContent = True
 HttpContext.Current.ApplicationInstance.CompleteRequest()
于 2016-06-14T17:16:51.830 に答える