在结果中使用A reapeat转换为base 64?

时间:2017-07-21 10:28:34

标签: java android

我在android中获取url并使用以下代码将数据流转换为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的结果并不完整,并给出了类似的结果:

  

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

重复的' A'显示出错了,图像不完整!为什么这不能正常工作?

3 个答案:

答案 0 :(得分:1)

简单:

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

您假设上面的总是一次性读取所有字节。

错误。此方法读取想要读取的字节数。因此,它会返回读取的数字字节。见其javadoc

  

返回:读入缓冲区的总字节数,如果由于已到达流末尾而没有更多数据,则返回-1。

换句话说:你必须循环并累积这些数字,直到你得到你正在寻找的字节数为止!

你得到那些A字符:你的数组最初都是0.如上所述:你只填充该数组的部分。所以其余的数组中仍然有0个 - 这在编码后会产生AAAAAs。

答案 1 :(得分:0)

您可以使用以下功能将图像转换为base64,只需传递图像....

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;
}

答案 2 :(得分:0)

GhostCat说的正确答案, 我改变了我的代码,它发现了:

 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){

                }
        }
    }