2011-04-03 18 views
0

我創建了一些代碼來處理從java客戶端到php服務器的基本文件上傳,但是我在命名和目錄創建時遇到了一些問題。這裏是代碼的重要組成部分:文件上傳系統工作不正常......有人可以看看這段代碼嗎?

我用它來上傳文件的方法:

public static void uploadWithInfo(Uri uri, String title, String artist, String description) { 
    try { 
     String path = uri.getPath(); 
     File file = new File(path); 
     URL url = new URL("http://**********/upload.php?title="+title+"&artist="+artist+"&description="+description); 
     HttpURLConnection connection = (HttpURLConnection)url.openConnection(); 
     connection.setDoOutput(true); 
     connection.setRequestMethod("POST"); 
     OutputStream os = connection.getOutputStream(); 

     BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file)); 
     int totalbytes = bis.available(); 

     for(int i = 0; i < totalbytes; i++) { 
      os.write(bis.read()); 
     } 
     os.close(); 

     BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream())); 
     String serverResponse = ""; 
     String response = ""; 

     while((response = reader.readLine()) != null) { 
      serverResponse = serverResponse + response; 
     } 
     reader.close(); 
     bis.close(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

這只是應該上傳的音頻文件。用戶輸入藝術家,標題和必要的簡短描述。實際的文件上傳得很好,所以我不認爲更多的java是必要的。這裏是關於PHP代碼到底:

<?php 

$uploadBase = "music/"; 
$uploadFolder = $_GET['artist']+"/"; 
$uploadFileName = $_GET['title']; 
$uploadFileDescription = $_GET['description']; 
$uploadPath = $uploadBase.$uploadFolder.$uploadFileName."%%D%%=".$uploadFileDescription.".mp3"; 

if(!is_dir($uploadBase)) { 
    mkdir($uploadBase); 
} 

if(!is_dir($uploadFolder)) { 
    mkdir($uploadFolder); 
} 

$incomingData = file_get_contents('php://input'); 

if(!$incomingData) { 
    die("No data."); 
} 

$fh = fopen($uploadPath, 'w') or die("Error opening path."); 
fwrite($fh, $incomingData) or die("Error writing file."); 
fclose($fh) or die("Error closing shop."); 

echo "Success!"; 

?> 

所以我得到的所有的標題,藝術家和說明輸入值。然後我創建2個目錄,如果它們不存在的話:一個用於音樂,一個用於上傳者輸入的藝術家。然後我創建一個基地(音樂)/文件夾(藝術家)/文件名(標題)「代碼讓我解析描述」(%% D %%)。

那麼一首歌比莉珍邁克爾 - 傑克遜描述「最愛」應該有

music/Michael Jackson/Billie%20Jean%%D%%favorite.mp3

但是我得到的路徑,方法是:

music/0Billie%%D%%=

目錄對於藝術家沒有創建,在標題之前有一個奇怪的0(它只包含第一個單詞),並且描述不顯示。

我真的不知道我哪裏錯了,誰能給我一些見解?謝謝。

+0

你的問題很難理解。請更新您的問題,以添加1)Java中的整個URL(包括編碼參數),2)PHP檢索的原始參數和3)路徑的'realpath()'的調試打印。 – BalusC 2011-04-04 00:05:23

+0

它看起來像一個編碼問題。由Java組裝的URL可能缺少urlencoding。它也可能包含一個'\ 0' NUL字節,這會導致文件名被截斷。無論如何在$ _GET變量上應用輸入過濾('\ w +'regex)。 – mario 2011-04-04 00:07:43

+0

我討厭聽起來像一個傻瓜,但我很新,而且我真的不知道當你說'realpath()'和'(\ w正則表達式)'時,你的任何一個意見都是要求的。編碼的事情可能是問題,我會包括我從java完整的上傳方法。 – JMRboosties 2011-04-04 00:18:26

回答

0

原來這是一個愚蠢的錯誤與一些相關的PHP代碼。對不起,麻煩你們。

0

您的InputStream.available()方法沒有達到您期望的效果。改用文件大小。

編輯:改爲使用多部分上傳。 Apache HttpClient支持它,谷歌爲examples

+0

我會這樣做,但上傳本身工作得很好,它的命名我有麻煩。 – JMRboosties 2011-04-04 04:18:02

相關問題