2011-12-12 24 views
1

我選擇上傳一個名爲about.png的文件,它位於位置「C:\ images \ about.png」 但是,當我在獲取文件未找到錯誤後單步執行代碼I看到它始終設置爲此路徑 「C:\ Program Files文件(x86)\ Common Files \ Microsoft共享\ DevServer \ 10.0 \ about.png」Path.GetFullPath給出不好的路徑

我確實上傳到我的web服務器,並得到了相同結果,所以它不是一個本地問題。 奇怪的是,Visual Studio安裝在E驅動器上,而不是C驅動器,這增加了更多的混淆。預先感謝您的幫助。

這是代碼。

request.FilePath = Path.GetFullPath(filefield.FileName); 

新增注:該文件可能來自任何地方的用戶會選擇一個資料圖片。我忘了提及這是一個上傳程序

回答

2

上傳的文件內容是HTTP請求的一部分 - 的ASP.NET文件上傳控件並該文件不保存在磁盤上。您必須使用SaveAs方法手動執行此操作。

FileName屬性僅提供文件名,因爲路徑信息將來自客戶端計算機,並且與服務器計算機上沒有任何相關性。因此,如果您嘗試使用 Path.GetFullPath以獲取文件名的完整路徑 - 它只是相對路徑,將會提供路徑w.r.t.當前目錄 - 就你而言,它變成了路徑開發Web服務器(隨Visual Studio一起提供)。

通常,您應該使用SaveAs方法將上載文件存儲在Web服務器上的指定位置 - 保存時使用的文件名應該是生成的文件名(例如GUID或其他ID)並存儲實際文件名在數據庫中與生成的文件名一起。這是因爲上傳文件名可能在服務器計算機上無效(認爲有人從MAC或Linux計算機上傳文件)。另一種方法是將文件保存在臨時位置的磁盤上,然後將內容推入數據庫本身。

+0

那麼,我需要將文件保存到網絡服務器,然後將其上傳到Amazon S3然後刪除文件? (這是我的主要目標) –

+0

@GregGoodwin,這是正確的 - 將文件保存在Web服務器上的臨時位置,然後將其上傳到亞馬遜商店。 – VinayC

1

Path.GetFullPath(...)返回相對於您當前目錄提供的文件名的路徑。

通常您的當前目錄是運行應用程序的位置,所以如果您從C:\Program Files (x86)\Common Files\Microsoft Shared\DevServer\10.0\運行,那麼該輸出是正確的。

您可能需要做的是使用Path.GetFileName從給定的filefield中提取文件名,然後使用Path.GetFullPath創建要保存到的位置的絕對路徑。

Path.GetFullPath文檔解釋了這個還算乾淨:

string fileName = "myfile.ext"; 
string path1 = @"mydir"; 
string path2 = @"\mydir"; 
string fullPath; 

fullPath = Path.GetFullPath(path1); 
Console.WriteLine("GetFullPath('{0}') returns '{1}'", 
    path1, fullPath); 

fullPath = Path.GetFullPath(fileName); 
Console.WriteLine("GetFullPath('{0}') returns '{1}'", 
    fileName, fullPath); 

fullPath = Path.GetFullPath(path2); 
Console.WriteLine("GetFullPath('{0}') returns '{1}'", 
    path2, fullPath); 

// Output is based on your current directory, except 
// in the last case, where it is based on the root drive 
// GetFullPath('mydir') returns 'C:\temp\Demo\mydir' 
// GetFullPath('myfile.ext') returns 'C:\temp\Demo\myfile.ext' 
// GetFullPath('\mydir') returns 'C:\mydir' 
+0

:沒有解釋溫度,演示direcotires。 – Hoque

+0

@Hoque:在這種情況下,推測應用程序的當前目錄位於'C:\ temp \ Demo \' –

+0

:上述示例演示了基於Windows的桌面平臺上的GetFullPath方法(鏈接提到它) – Hoque