2009-07-15 195 views
37

我正在使用FileUpload控件的Web應用程序。我在我試圖上傳的完整文件路徑'C:\ Mailid.xls'中有一個xls文件。使用FileUpload控件獲取文件的完整路徑

當我使用命令

FileUpload1.PostedFile.FileName 

我無法從我的系統完整的文件路徑。但是,當我在另一個系統中使用上述命令時,它工作正常。

我也嘗試沒有成功下列命令:

System.IO.Path.GetFullPath(FileUpload1.PostedFile.FileName); 
    Path.GetFileName(FileUpload1.PostedFile.FileName); 
    System.IO.Path.GetDirectoryName(FileUpload1.PostedFile.FileName).ToString(); 
    Convert.ToString(System.IO.Directory.GetParent(FileUpload1.PostedFile.FileName)); 

我怎樣才能得到完整的路徑?

+0

在你幹活是什麼語言?你究竟需要做什麼,以及如何?我ddidnt理解這個問題。 – Strae 2009-07-15 10:22:29

+1

您需要提供更多信息(編輯您的帖子)。語言,平臺你的錯誤信息。並且請使用編輯器代碼按鈕來格式化您的代碼。 – Nifle 2009-07-15 10:26:32

回答

10

嘗試

Server.MapPath(FileUpload1.FileName); 

編輯:這個答案說明如何獲取路徑到服務器上的文件。它沒有描述如何獲得客戶端文件的路徑,這就是問題的要求。這個問題的答案是「你不能」,因爲現代瀏覽器不會告訴你客戶端的路徑,出於安全原因。

7

出於安全原因,FileUpload永遠不會爲您提供完整路徑。

+0

嗨 感謝您的回覆。 但是,該命令顯示另一個系統中的完整路徑。 怎麼可能。 – Dhanraj 2009-07-15 10:42:02

+0

使用fileUpload,您無法獲取文件的客戶機的完整路徑。沒門。 FileUpload能夠處理上傳文件,並且不需要擔心路徑。 您可能通過其他方式獲得了文件的完整路徑(例如System.IO.Path或MapPath或其他)。但我懷疑你使用FileUpload來獲取完整路徑。 – waqasahmed 2009-07-15 11:53:09

16

也許你誤會了FileUpload的工作方式。

當您上傳文件時,它將有效地從客戶端計算機傳輸到託管應用程序的服務器。如果您正在開發應用程序,大多數時候,客戶端和服務器都是同一臺計算機(您的計算機)。但是,一旦部署了應用程序,就可以有任意數量的客戶端連接到服務器,每個客戶端都會上傳一個不同的文件。

瞭解客戶端計算機上文件的完整路徑通常不是必需的 - 您通常會想要對文件內容進行操作。你的例子看起來像ASP.NET C#,所以我猜你正在使用FileUpload控件。您可以通過讀取原始數據流(FileUpload.PostedFile.InputStream)或先保存文件(FileUpload.PostedFile.SaveAs),然後訪問保存的文件來獲取上傳的文件內容。如果您希望在當前請求之後訪問該文件,則保存該文件是您的責任 - 如果您不需要,ASP.NET會將其刪除。

還有一件事 - 不要忘記在表單上將enctype屬性設置爲「multipart/form-data」。如果你不這樣做,客戶端的瀏覽器將不會發送該文件,並且你會花上幾分鐘的時間想知道出了什麼問題。

+0

正在開發一個Web應用程序。我正在使用文件上傳控制來瀏覽files.It工作正常。 今天我安裝了IE 8 安裝完後我無法得到文件的完整路徑 有什麼問題 事件我卸載了IE 8.目前我用的是IE 7 – Dhanraj 2009-07-15 11:07:38

+1

這對我有效:`FileUpload.PostedFile .FileName`謝謝elo80ka – Somebody 2012-11-03 23:18:13

+0

就是這樣。忘記了該控件的基本功能。 – Stanton 2014-05-02 22:52:04

0

您無法在客戶端機器上獲取文件的完整路徑。您的代碼可能在本地主機上運行,​​因爲您的客戶端和服務器是同一臺計算機,並且該文件位於根目錄。但是如果你在遠程機器上運行它,你會得到一個異常。

28

這是目前真,「當你上傳文件,瀏覽器將只發送源文件名,而不是完整路徑」 - 它非常有意義,服務器有沒有企業知道文件是否是在「C: \ WINDOWS \「或」F:\ SOMEDIR \ OTHERDIR \ PERSONALINFO \「。文件名稱總是發送,對於幫助用戶「識別」內容並可能詢問文件擴展名以幫助確定文件類型非常有用。

但是我從經驗中得知,Internet Explorer絕對使用來用於(在舊版本中)發送整個路徑。這是很難找到一個權威的確認(除本apache fileupload control doco

的Internet Explorer提供了整個路徑上傳的文件,而不僅僅是基本文件名

無論如何,你不應該使用也不指望完整路徑由任何'現代'瀏覽器發送。

3

IE 7和以前的版本將上傳文件的完整路徑發送到與input type="file"字段相關的服務器。 Firefox和其他現代瀏覽器認爲這是一個安全缺陷,而不是。但是,這似乎已被修復在IE 8中。

也許您應該改爲評估爲什麼需要文件的完整路徑,因爲它位於客戶端的系統上。我認爲這是真的多餘的信息,永遠不應該發佈。所有您應該關心的是文件名,以便您可以保存文件而不更改名稱。

2

只給我2美分。

在這一刻我也得到完整用戶的本地路徑。我只能從一臺機器上覆制這個問題,但它確實在用戶的機器上提供了文件的完整路徑。

這是我們的應用程序的最終用戶,它位於異地服務器上。所以它不在本地機器上,也不在本地服務器上,它可能是共享的。

可以解決這個問題,至少有同樣的行爲被這一切的時候:

Path.GetFileName(fileUpload.FileName) 

順便說一句,只是發現這篇文章該條規定可得發生:http://www.eggheadcafe.com/community/aspnet/17/10092650/fileupload-control-pro.aspx

只是爲了確認問題。

2

我和原來的海報有一些相反的問題:當我只想要文件名時,我得到了完整的路徑。我使用Gabriël的解決方案來獲取文件名,但是在這個過程中,我發現了爲什麼你在某些機器上獲得完整路徑,而不是其他人。

任何加入域的計算機都會返回文件名的完整路徑。我在幾臺不同的計算機上試過這個,結果一致。我沒有解釋爲什麼,但至少在我的測試中是一致的。

0

我使用IE 8(在兩臺獨立的機器上)。每個仍然上傳完整的本地文件路徑。正如Gabriël,Path所建議的那樣。GetFileName(fileUploadControl.PostedFile.FileName)似乎是確保只獲取文件名的唯一方法。

1

檢查:

<%@ Page Language="VB" AutoEventWireup="false" CodeFile="FileUp.aspx.vb" Inherits="FileUp" %> 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
    <title></title> 
</head> 
<body> 
    <form id="form1" runat="server"> 
    <div> 
     <asp:Label ID="Label1" runat="server"></asp:Label><br /> 
     <asp:FileUpload ID="FileUpload1" runat="server" /><br /> 
     <asp:Button ID="Button1" runat="server" Text="Upload" /> 
    </div> 
    </form> 
</body> 
</html> 

代碼:

Partial Class FileUp 
    Inherits System.Web.UI.Page 
    Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click 
     Dim path As String 
     Dim path1 As String 
     path = Server.MapPath("~/") 
     FileUpload1.SaveAs(path + FileUpload1.FileName) 
     path1 = path + FileUpload1.FileName 
     Label1.Text = path1 
     Response.Write("File Uploaded successfully") 
    End Sub 
End Class 
1

Check this post under FileUpload Control

此外,URLAction已經被設置爲 「禁用」,爲「上傳文件時包含本地目錄路徑」 Internet區域。此更改可防止潛在敏感的本地文件系統信息泄漏到Internet。例如,Internet Explorer 8現在只提交文件名image.png,而不是提交完整路徑C:\ users \ ericlaw \ documents \ secret \ image.png。

其在互聯網安全的選項可啓用

7
Convert.ToString(FileUpload1.PostedFile.FileName); 
0
Path.GetFullPath(fileUpload.PostedFile.FileName); 

很抱歉,這會得到你的程序文件目錄+文件名。

0

在Internet Explorer選項上,在安全選項卡上單擊自定義安全性按鈕,在將某些文件加載​​到服務器時,可以選擇發送本地路徑。

默認情況下已禁用。只需啓用它。

0
dim path as string = FileUpload1.PostedFile.FileName 

順便說一句,我使用Visual Studio 2010.我不知道是否有與其他版本的區別。

1

這將文件名轉儲到臨時文件夾中的文件,然後您可以調用它,而不用擔心它。因爲如果它在您的臨時文件夾中達數天,它將被刪除。

string filename = Path.Combine(Path.GetTempPath(), Path.ChangeExtension(Guid.NewGuid().ToString(),".xls")); 
       File.WriteAllBytes(filename, FileUploadControl.FileBytes); 
0

如果我們使用IE瀏覽器,這不會有問題。 這是用於其他瀏覽器,將文件保存在另一個位置並使用該路徑。

如果(FileUpload1.HasFile)

{

字符串文件名= FileUpload1.PostedFile.FileName;

string TempfileLocation = @「D:\ uploadfiles \」;

string FullPath = System.IO.Path.Combine(TempfileLocation,fileName);

FileUpload1.SaveAs(FullPath);

Response.Write(FullPath);

}

謝謝

相關問題