2014-02-06 197 views
0

我已經採用了一個asp/c#web應用程序來修復原來在我工作場所的開發人員完成的工作。該代碼顯示了一個由查詢結果填充的Gridview,該查詢顯示了文件列表,其中一列由'命令字段'組成,當單擊下載文件時。一切似乎順利,直到它到達文件下載,因爲它似乎無法找到服務器上的文件。我的C#真的不是很強大,所以請耐心等待,如果您需要更多的信息,我已經錯過了,請說明一下。無法找到文件下載路徑錯誤的一部分

這裏是代碼的特定部分引起的問題:

//strSuppDocName - is already declared elsewhere 
string path = System.IO.Path.Combine(Server.MapPath("~/Documents/"), strSuppDocName); 

if (!Directory.Exists(path)){ 
       System.Windows.Forms.MessageBox.Show(path + " - file path doesn't exist"); 
      } 
      else { 
       System.Net.WebClient client = new System.Net.WebClient(); 
       Byte[] buffer = client.DownloadData(path); 

       if (buffer != null) 
       { 
        Response.ClearContent(); 
        Response.ClearHeaders(); 
        FileInfo file = new FileInfo(path); 
        Response.Clear(); 
        Response.AddHeader("Content-Disposition", "Attachment;FileName:" + file.Name); 
        Response.AddHeader("Content-Length", file.Length.ToString()); 
        Response.ContentType = ReturnExtension(strExtSuppDoc.ToLower()); 

        Response.WriteFile(file.FullName); 
        Response.End(); 
       } 
      } 

什麼,當我運行的代碼是網格視圖填充好的情況,我點擊要下載的文件,它進入的第一個分支if語句顯示路徑。在我添加if語句之前,它顯示以下錯誤:「無法找到路徑的一部分」。我試着用路徑擺弄如絕對設置它:

string path = System.IO.Path.Combine(@"E:\web\Attestation\Documents\", strSuppDocName); 

而且沒有使用上述組合方法並且使用「+」標準字符串連接。非常感謝任何幫助或指導,謝謝!

+0

那麼究竟什麼是* *路徑和你確定它實際上*不*存在嗎?你可以像IIS運行的用戶那樣訪問它嗎? – nvoigt

+0

感謝您的回覆@nvoigt - _path_是一個文件,可能是PDF或圖像(PNG,JPEG等)。我檢查過文件系統,它確實存在,我也嘗試在本地運行代碼,並將文件本地添加到我的PC,這導致我相信代碼是錯誤的,因爲該文件在那裏。如果我將它直接指向文件而不是目錄,Directory.Exists()會返回false嗎?也許這是問題? – haakym

+1

當然,如果你在那裏放置一個文件,它將返回false,因爲這不是一個目錄。 – nvoigt

回答

0

答案總之是文件名不正確。

奇怪或錯誤的代碼作者,當上傳給定的文件,添加一個額外的擴展名,所以一個文件將像'image.png'開始,然後上傳時將成爲image.png.png。爲什麼我沒有注意到這一點之前你可能會問?只是因爲在Windows XP中沒有顯示整個路徑(不要問爲什麼我使用XP),並且很久之前我就忽略了這個問題 - 這是一個很大的錯誤!在嘗試通過在Windows資源管理器地址欄中輸入文件的地址來查找文件並收到文件不存在的錯誤後,我可以清楚地看到它的確存在,但一位同事使用Windows 7遠程查看該文件我們看到該文件顯示爲'image.png.png'。此後,文件路徑正常工作。

1

你在這裏混合了一些技術。首先,這並不在Web應用程序屬於:

System.Windows.Forms.MessageBox.Show(path + " - file path doesn't exist"); 

Web應用程序無法在Windows窗體應用程序。這不會向使用該Web應用程序的用戶顯示任何內容,因爲沒有通過HTTP「消息框」的概念。

更重要的是,您使用path的方式有兩種截然不同的方式。在這裏:

Byte[] buffer = client.DownloadData(path); 

這裏:

FileInfo file = new FileInfo(path); 

path網絡上的網址或文件系統上的文件?它不能兼而有之。第一行將其視爲URL,嘗試從Web服務器下載。第二行將它視爲本地文件,試圖從文件系統中讀取它。

什麼path和你是如何訪問它?如果是網址,請將其下載WebClient並將其傳送給用戶。如果是文件,請從文件系統中讀取並將其傳送給用戶。你不能同時做兩個。

+0

感謝您的回覆David。對,這是有道理的爲什麼彈出窗口顯示當我正在調試,但不是當在服務器上!什麼是正確的方式來做到這一點?我正在查看'ClientScript'。 '路徑'是Web服務器上的文件,可能是PDF或圖像。好吧,這是有道理的,所以我需要堅持第二種方法。 – haakym

+0

@haakym:你如何處理調試信息取決於你想要去的地方。如果你想將它渲染到頁面上,那麼你需要將它包含在頁面的某個地方。不過,這可能會讓這個過程複雜化,如果這只是調試輸出。另一個常見的選擇是簡單地將它記錄在某處(文件,數據庫等)。有很多日誌框架可以幫助解決這個問題。我個人的偏好是log4net,但也有其他的。 – David

1

如果您正在與網絡上的路徑進行交互(又名UNC路徑),則必須使用Server.MapPath將UNC路徑或虛擬路徑轉換爲.NET可以理解的物理路徑。因此,無論何時打開文件,創建,更新和刪除文件,打開目錄和刪除網絡路徑中的目錄,都可以使用Server.MapPath

例子:

System.IO.Directory.CreateDirectory(Server.MapPath("\\server\path")); 
相關問題