2013-07-24 90 views
1

我試圖在sd卡上創建一個圖像文件,從調用Web服務後服務器向我發送的字節構建它(基本上:下載文件)。 我設法在客戶端的「東西」,並嘗試這些字節寫入文件,使用:Android:將字節寫入SD卡上的圖像文件

FileOutputStream fOut = null; 
BufferedOutputStream bOs = null; 

try { 
     fOut = new FileOutputStream(returnedFile); 

     bOs = new BufferedOutputStream(fOut); 

     bOs.write(bytesToWrite); 

} 
catch (FileNotFoundException e) { 
     e.printStackTrace(); 
} 
catch (Exception e) { 
     e.printStackTrace(); 
} 
finally { 
     try { 
      if (bOs != null) { 
       bOs.close(); 
       fOut.close(); 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

但圖像文件被破壞(其大小> 0KB,但打破)。 我最終用文本編輯器在我的電腦上打開了該文件,並且我看到一些初始文件數據(在發送之前)與最後一個不同。所以我猜猜是有某種編碼錯誤或類似的東西。 我很想知道如何使這項工作(從web服務器下載圖像文件,並在我的手機上打開)的想法。 PS。我也可以更改或獲取有關服務器配置的信息,因爲它是由我的一位朋友配置的。 PS2。我應該不能僅下載圖像,而是可以下載任何類型的文件。

+0

您確定該響應不在Base64中嗎?我曾經遇到過這個問題,Base 64解碼解決了它! –

+0

什麼是pData? – njzk2

+0

sry,已更新pData.getBytes()已更改爲bytesToWrite(來自服務器的實際字節數) – DoruAdryan

回答

0

我覺得這是更好您編碼圖像的Base64在你的服務器,例如PHP,你可以做這樣的:

$type = pathinfo($path, PATHINFO_EXTENSION); 
$data = file_get_contents($path); 
$base64 = 'data:image/' . $type . ';base64,' . base64_encode($data); 

然後在Android版解碼Base64編碼字符串到您的圖像文件:

FileOutputStream fos = null; 
try { 

if (base64ImageData != null) { 
    fos = context.openFileOutput("imageName.png", Context.MODE_PRIVATE); 
    byte[] decodedString = android.util.Base64.decode(base64ImageData, android.util.Base64.DEFAULT); 
    fos.write(decodedString); 

    fos.flush(); 
    fos.close(); 

    } 

} catch (Exception e) { 

} finally { 
    if (fos != null) { 
     fos = null; 
    } 
} 
+0

這看起來接近我想要的,但問題是:我能否使它能夠下載除圖像以外的其他類型的數據(因爲它們現在工作,唯一的問題是圖像)? – DoruAdryan

+0

是的,我認爲你可以編碼/解碼任何文件類型(音頻,圖像..)到/從base64 –

0

首先確保你的Android清單上有這個權限。

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 
<uses-permission android:name="android.permission.INTERNET"/> 

文件流旨在用於本地文件存儲而不是網絡連接。改爲使用URLConnection類。

URL uri = new URL("Your Image URL"); 
URLConnection connection = uri.openConnection(); 
InputStream stream = connection.getInputStream(); 
//DO other stuff.... 
+0

我從服務器獲取字節並使用FileOutputStream寫入本地存儲。那有什麼問題?我的問題是,出來的字節不是(可能)以與服務器相同的方式進行編碼。我的想法是,我成功地寫入文件的字節,但他們是incorect,或至少,不正確「理解」,以解碼他們的權利。 – DoruAdryan