2010-03-01 40 views
1

我正在開發一個應用程序,使用Eclipse IDE中的Derby作爲數據庫。我有一個功能可以將文件上傳到數據庫。但是文件名將被存儲爲「C:\ Documents and Settings \ Angeline \ Desktop \ test.txt」而不是「test.txt」。如何才能將「test.txt」作爲文件名存儲在數據庫中?如何在java或jsf中獲得所需的子字符串形式的字符串?

這是我在JSF代碼:

File to Upload: 

<t:inputFileUpload id="fileupload" value="#{employeeBean.upFile}" storage="file"/> 

的Java Bean代碼:

String fileName=upFile.getName(); 

此文件名= C的值:\ Documents和Settings \安吉麗娜\桌面\ test.txt的。

回答

2
lastSlashIndex = name.lastIndexOf("\\"); 
if (lastSlashIndex == -1) { 
    lastSlashIndex = name.lastIndexOf("/"); //unix client 
} 
String shortName = name; 
if (lastSlashIndex != -1) { 
    shortName = name.substring(lastSlashIndex); 
} 

注意,如果* nix上的文件名包含\這是不行的。

+0

我會在子串調用前檢查lastSlashIndex – helios

+0

如果您使用* NIX並且文件名中有反斜槓,該怎麼辦? –

+0

我不認爲* NIX用戶運行MSIE。 – BalusC

2

new java.io.File(myPath).getName();

你也許可以做一些更有效的只有字符串操作,但是根據應用負載等操作時,它可能不值得。

+0

我不知道,如果客戶端是一個Linux和服務器是Windows會發生什麼。我的意思是:路徑是來自客戶端操作系統的路徑,而不是服務器。 – helios

+0

這不起作用。至少不是Sun的JRE,因爲它使用'FileSystem.getSeparator()'。 –

0

我認爲這將是更安全的看到這不是一個字符串處理的問題,但作爲一個路徑名解析問題:

String filename = new File(pathname).getName() 
2

戰斧t:inputFileUpload是建立在Apache Commons FileUploadApache Commons IO頂部。在文件上傳常見問題,你可以找到名爲"Why does FileItem.getName() return the whole path, and not just the file name? "一個條目包含以下答案:

的Internet Explorer提供了整個路徑上傳的文件,而不僅僅是基本文件名。由於FileUpload完全提供了客戶端(瀏覽器)提供的內容,因此您可能希望在應用程序中刪除此路徑信息。您可以使用Commons IO中的以下方法(您已擁有該方法,因爲它已被FileUpload使用)執行此操作。

String fileName = item.getName(); 
if (fileName != null) { 
    filename = FilenameUtils.getName(filename); 
} 

總之,只要使用FilenameUtils#getName()擺脫已經由MSIE被不必要附加的完整路徑的(所有其他真實/正常化網頁瀏覽器中不添加完整的客戶端的路徑,而只是提供根據HTML格式規範的唯一文件名)。

所以,你基本上需要做的就是更換

String fileName = upFile.getName(); 

通過

String fileName = FilenameUtils.getName(upFile.getName()); 
相關問題