2009-12-10 96 views
1

我想從諾基亞手機上傳一個大文件到服務器,我使用下面的代碼。此代碼適用於小文件。當我想上傳更大的文件(大約10mb)時,我收到內存不足的消息。有誰知道我怎樣才能轉換這個代碼上傳文件使用 多個httpConnections,每個連接發送一個文件塊。我們假設服務器支持這一點。在J2ME中使用多個hppt連接上傳大文件

fc = (FileConnection)Connector.open("file:///myfile", Connector.READ); 
is = fc.openInputStream(); 

// opening http connection and outputstream 
HttpConnection http = (HttpConnection)Connector.open(url, Connector.WRITE); 
http.setRequestMethod(HttpConnection.POST); 
http.setRequestProperty("Content-Type", type); 
http.setRequestProperty("Connection", "close"); 

OutputStream os = http.openOutputStream(); 


int total = 0; 

while (total < fileSize) {  
    byte b[] = new byte[1024]; 
    int length = is.read(b, 0, 1024); 

    os.write(b, 0, length); 
    total += length; 
} 
os.flush(); 


int rc = http.getResponseCode(); 
os.close(); 
http.close(); 

回答

1

嘗試移動while循環內的os.flush()呼叫,所以緩衝器每次沖洗。目前,您的整個文件在通過線路發送之前正在被讀入內存。

如果這樣不能解決問題,我會建議使用profiler在模擬器中運行代碼,以便更好地瞭解內存在哪裏被用完。

+0

os.flush不while循環裏面工作。我會嘗試使用分析器。我正在尋找像這樣的解決方案:http://discussion.forum.nokia.com/forum/showthread.php?t=176546&highlight=upload+chunk(請參閱最新評論) – user75569 2009-12-11 08:06:01

1

嘗試在while循環之前移動緩衝區初始化byte b[] = new byte[1024]; - 您無需每次都重新創建它。並嘗試將System.gc()放入循環中 - 它可能有幫助(或不可)。

此外,某些設備可能會嘗試把整個文件到內存中,當你調用fc.openInputStream