none
資料庫檔案下載後開啟毀損問題? RRS feed

  • 問題

  • 版上前輩想請問一個檔按毀損問題:
    我經由程式先上傳一個檔案,檔名為802.11n Draft 2.0 InteroperabilityTest Plan version 1-6-1_20091019a,但是經由我的程式到資料庫搜尋後下載檔案後文件檔名卻變成802.11n+Draft+2.0+InteroperabilityTest+Plan+version+1-6-1_20091019a,中間得空格地方經由程式會添加一個"+"符號,如此我欲開啟檔案卻出現"開啟檔案遭毀損"的錯誤訊息,小弟試過中間沒有空格的檔案名稱是下載後開啟沒有問題的,所以是否是原始檔案中間有空格的問題導致程式下載後出現檔名遭更改,開啟失敗,請問版上前輩有什麼方法可以避免下載後檔名遭更改,開啟檔案是成功的方式...謝謝大家!
    程式如下:(asp.net vb)
                
            gvRow = CType(CType(e.CommandSource, Button).NamingContainer, GridViewRow)
            strModelID = DownloadView.DataKeys(gvRow.RowIndex).Value.ToString
            ds = objData.GetDataQuery(strModelID)
            If ddlKind.Text = "Wi-Fi Forum" Then
                If ddlType.Text = "pdf" Then
                    '===索引值與檔案名稱相對應===
                    Dim DownloadFile_Name As String = "C:\InternationalGuide\Wi-Fi Fourm\PDF\" & ds.Tables(0).Rows(0).Item("DocumentName").ToString & ".pdf"
                    Dim nDownloadFile_Name As String = "C:\Inetpub\wwwroot\SIT_System\WebForm\Temp\" & "new_" & ds.Tables(0).Rows(0).Item("DocumentName").ToString & ".pdf"
                    '============================
                    System.IO.File.Copy(DownloadFile_Name, nDownloadFile_Name, True)
                    fileName = Right(nDownloadFile_Name, (nDownloadFile_Name.Length - 43)) '抓取文件檔名
                    Dim iStream As System.IO.Stream = Nothing
                    Dim buffer As Byte() = New Byte(9999) {} '以10K為單位暫存:
                    Dim length As Integer

                    Dim MyDownloadFile As New System.IO.FileInfo(DownloadFile_Name)
                    Dim dataToRead As Long
                    Dim FileDownloadPath As String = Server.MapPath("Temp/" & fileName) ' 制定文件路徑
                    Dim FileDownloadName As String = System.IO.Path.GetFileName(FileDownloadPath) '得到文件名.

                    Try
                        iStream = New System.IO.FileStream(FileDownloadPath, System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.Read) ' 打開文件
                        dataToRead = iStream.Length ' 得到文件大小
                        Response.ContentType = "application/x-rar-compressed"
                        Response.AddHeader("Content-Disposition", "attachment; filename=" + HttpUtility.UrlEncode(DownloadFile_Name))
                        While dataToRead > 0
                            '保証client連接
                            If Response.IsClientConnected Then
                                length = iStream.Read(buffer, 0, 10000)

                                Response.OutputStream.Write(buffer, 0, length)

                                Response.Flush()

                                buffer = New Byte(9999) {}
                                dataToRead = dataToRead - length
                            Else
                                '結束循環
                                dataToRead = -1
                            End If
                        End While
                    Catch ex As Exception
                        ' error;
                        Response.Write("Error : " + ex.Message)
                    End Try
                    If iStream IsNot Nothing Then
                        '關閉文件
                        iStream.Close()
                    End If
                    System.IO.File.Delete(nDownloadFile_Name)
                End If

    2010年3月9日 上午 07:49

解答

  • 試看看
    Response.AddHeader("Content-Disposition", "attachment; filename=" + HttpUtility.HtmlEncode(DownloadFile_Name))

    Response.AddHeader是在HTML內不是網址列,編碼方式不一樣
    2010年3月9日 上午 08:03
  • 感謝版上的阿尼&programlin提供的方法與技巧,我目前將程式改成HttpUtility.HtmlEncode(DownloadFile_Name))以及在程式最後面加上
    Response.Close()這一段程式,能將檔案開啟且無損壞,但原始檔名如:802.11n Draft 2.0 InteroperabilityTest Plan version 1-6-1_20091019a但下在後檔名似乎會加上如:(C__InternationalGuide_Wi-Fi_Fourm_PDF_)802.11n_Draft_2.0_InteroperabilityTest_Plan_version_1-6-1_20091019a括弧內的這一串文字,這問題倒是不會對我程式有太大困擾,但是這一段標題的產生是否是html標頭所產生的呢?

    2010年3月11日 上午 02:36

所有回覆

  • 試看看
    Response.AddHeader("Content-Disposition", "attachment; filename=" + HttpUtility.HtmlEncode(DownloadFile_Name))

    Response.AddHeader是在HTML內不是網址列,編碼方式不一樣
    2010年3月9日 上午 08:03
  • Response.AddHeader("Content-Disposition", "attachment; filename=" + Server.UrlPathEncode(DownloadFile_Name))

    你這段程式碼是放在.aspx.vb裡面嗎?
    是的話會多輸出一些html碼
    http://social.msdn.microsoft.com/Forums/zh-TW/236/thread/32212195-5e3d-431b-b61b-b72c5547f1e1
    2010年3月9日 上午 08:14
    版主
  • Hello programlin :
    謝謝您所提供的方法,但似乎還是檔案開啟失敗!

    Hello 阿尼:
    我試過您所提供的方式, 我將這段程式碼Response.Close()放置我程式這一段中,如下:
                   End If
                   Response.Close()
                    System.IO.File.Delete(nDownloadFile_Name)
                End If
    檔案開啟似乎已經正常沒有損毀的情形,但是檔案名稱下載後會更改如上述(題問一)的情形,檔名中被加入"+"符號802.11n+Draft+2.0+InteroperabilityTest+Plan+version+1-6-1_20091019a,在觀看之前您解答的問題中請問,這一段程式意思是
    (加入.ashx項目或是自己寫類別去繼承IHttpHandler,不過Response要改成Context.Response),感覺不是很懂,還是有其他的方式是可以避免檔名更改的問題...謝謝大家!!

     

    2010年3月9日 上午 09:17
  • 那這樣看起來你的檔案打不開應該跟檔名沒關係,是aspx多輸出了一些html tag的關係

    用Program大的方式呢?檔名還是會被改掉嗎?
    我這邊試倒是挺正常的


    IHttpHandler..........你新增一個.ashx就知道了
    不過這個跟檔名被更改沒什麼關係
    2010年3月9日 上午 10:27
    版主
  • 感謝版上的阿尼&programlin提供的方法與技巧,我目前將程式改成HttpUtility.HtmlEncode(DownloadFile_Name))以及在程式最後面加上
    Response.Close()這一段程式,能將檔案開啟且無損壞,但原始檔名如:802.11n Draft 2.0 InteroperabilityTest Plan version 1-6-1_20091019a但下在後檔名似乎會加上如:(C__InternationalGuide_Wi-Fi_Fourm_PDF_)802.11n_Draft_2.0_InteroperabilityTest_Plan_version_1-6-1_20091019a括弧內的這一串文字,這問題倒是不會對我程式有太大困擾,但是這一段標題的產生是否是html標頭所產生的呢?

    2010年3月11日 上午 02:36
  • 那是你自己加的吧?

     Dim DownloadFile_Name As String = "C:\InternationalGuide\Wi-Fi Fourm\PDF\" & ds.Tables(0).Rows(0).Item("DocumentName").ToString & ".pdf"


    以下為簽名檔,請勿對話入座:
    初學不是問題,但用不正確的態度來問問題,那就是很大的問題。
    請不要藉新手之名行小白之實,否則只會讓更多無辜的新手得不到幫助而已。
    如果不知道什麼是小白,請參閱:何謂小白
    2010年3月11日 上午 03:00
    版主
  • 謝謝版主提醒,我已經在程式上做修正了~~
    感謝版上的前輩對程式問題願花時間提供心得與建議!!
    謝謝大家~~

    • 已標示為解答 balaso 2010年3月11日 上午 03:23
    • 已取消標示為解答 小朱MVP, Moderator 2010年3月11日 上午 03:48
    2010年3月11日 上午 03:23