2017-07-21 2 views
1

私はアンドロイドでURLを取得し、このコードの64ビットデータ列にデータ・ストリームを変換:結果にreapeatを付けてベース64に変換しますか?

URL url = new URL("http://iranassistance.com/images/sos-logo.png"); 
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); 
urlConnection.setRequestMethod("GET"); 
//urlConnection.setDoOutput(true); 
urlConnection.connect(); 
File SDCardRoot = Environment.getExternalStorageDirectory().getAbsoluteFile(); 
String filename="downloadedFile.png"; 
Log.i("Local filename:",""+filename); 
File file = new File(SDCardRoot,filename); 
if(file.createNewFile()) { 
    file.createNewFile(); 
} 
FileOutputStream fileOutput = new FileOutputStream(file); 
InputStream inputStream = urlConnection.getInputStream();byte[] imageBytes = new byte[urlConnection.getContentLength()]; 
inputStream.read(imageBytes, 0, imageBytes.length); 
inputStream.close(); 
String base64Image = Base64.encodeToString(imageBytes, Base64.DEFAULT); 

しかしbase64Image結果が完了していないと、このような何か与えた:

を..../o2RfctcZtc8Hr5xcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA ..nUTJaJnb7PLyscfBMQLLiexyKSEh ........

繰り返し '' ショーの何かが間違っているとIMAですゲットは完全ではありません!なぜこれが正しく動作しないのですか?

あなたは自分の画像に渡すBASE64に画像を変換するには、次の機能を使用することができます

答えて

1

inputStream.read(imageBytes, 0, imageBytes.length); 

あなたは上記は、常にすべて読み込むことを前提としてい1ショットのバイト数。

間違っています。このメソッドは、読み取りたいバイト数だけ読み取ります。したがって、番のバイトが返されます。

戻り値:バッファに読み込まれたバイトの合計数、または-1ストリームの終わりに達したため、より多くのデータが存在しない場合はそのjavadocを参照してください。言い換えれば

:あなたはループに持って、あなたは正確にあなたが探しているバイトの量を持ってまで、これらの番号を蓄積!

これらのA文字を取得すると、配列は最初はすべて0です。説明したように、の部分はの配列にしか塗りません。残りの配列には0が残ります。これはエンコーディング後にAAAAAsとして発生します。

0

....

private String encodeImage(Bitmap mphoto) 
{ 
    ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
    mphoto.compress(Bitmap.CompressFormat.JPEG,100,baos); 
    byte[] b = baos.toByteArray(); 
    String encImage = Base64.encodeToString(b, Base64.DEFAULT); 

    return encImage; 
} 
シンプル
+0

を。それはビットマップする必要はありません! – Mohammad

+0

これは問題ではありません。 ** read **の部分は間違っています。それは、エンコードするバイトが**完全でない**ときに、エンコードを見るのに役立ちません。 – GhostCat

+0

画像URLがある場合はまずビットマップに変換してから、関数 –

0

GhostCatは私が怒鳴るように自分のコードを変更正解、 を述べ、それが発見働いた:私は私のデータベースに保存することをBase64にInputStreamを変更する必要が

InputStream is = null; 
    try { 

     URL url = new URL("http://iranassistance.com/images/sos-logo.png"); 
     ByteArrayOutputStream baos = new ByteArrayOutputStream(); 

     is = url.openStream(); 
     byte[] byteChunk = new byte[4096]; 
     int n; 

     while ((n = is.read(byteChunk)) > 0) { 
      baos.write(byteChunk, 0, n); 
     } 

     String base64Image2 = Base64.encodeToString(baos.toByteArray(), Base64.DEFAULT); 
     db.UpdateImage64(base64Image2); 
     productModel pd = db.GetProductById(2); 

    } 
    catch (IOException e) { 
     e.printStackTrace(); 

    } 
    finally { 
     if (is != null) { 
      try{ 
       is.close(); 
      } 
       catch (IOException s){ 

       } 
     } 
    } 
関連する問題