안녕하세요.
서버에서 동적으로 만들어지는 이미지 파일을 다운 받아서 화면에 뿌려줘야하는데,
잘 안되고 있습니다. 아시는 분 도움을 부탁드립니다.
(질문은 처음이네요. ㅎㅎ)
일반적으로 웹에 있는 이미지의 URL을 넣으면 잘 보여지는데, 서버에서 동적으로 생성하는
이미지의 경우에는 안보이네요. ㅠㅠ
아래는 관련 코드입니다.
getImageStream()에서 URL을 준비하고 DownloadImage에서 받아와서 getImageStream()에서 보여주는 흐름입니다.
아래 주석처리 되어 있는 경로의 이미지를 가져올 경우에는 잘 보여지는데,
imageurl 에 동적 url (예. http://test.test.com/createImage.do?id=image&page=1) 을 넣게 되면
conn.getContentLength() 가 -1 값이 나오네요.
해당 url을 브라우져에서 보면 이미지가 잘 나옵니다. ;;;;
무엇을 빼먹은 걸까요? 아시는 분 답변을 부탁드립니다.
public void getImageSteam(String imageurl)
{
//imageurl = "http://a3.twimg.com/profile_images/1149292099/Fateflysy_normal.jpg";
String path = Environment.getDataDirectory().getAbsolutePath();
path += "/data/"+getPackageName()+"/files/test.png";
if (new File(path).exists() == false)
{
DownloadImage(imageurl, "test.png");
}
Bitmap bitmap = BitmapFactory.decodeFile(path);
img.setImageBitmap(bitmap);
}
boolean DownloadImage(String Url, String FileName)
{
URL imageurl;
int Read;
Log.d(LOG_TAG, " filename : " + FileName);
try
{
imageurl = new URL(Url);
Log.d(LOG_TAG, " imageUrl " + imageurl);
HttpURLConnection conn= (HttpURLConnection)imageurl.openConnection();
Log.d(LOG_TAG, " conn length : " + conn.getContentLength());
int len = conn.getContentLength();
byte[] raster = new byte[len];
InputStream is = conn.getInputStream();
FileOutputStream fos = openFileOutput(FileName, 0);
for (;;)
{
Read = is.read(raster);
if (Read <= 0)
{
break;
}
fos.write(raster,0, Read);
}
is.close();
fos.close();
conn.disconnect();
} catch (Exception e) {
Log.d(LOG_TAG, e.toString());
return false;
}
return true;
}




자답입니다. 이미지 관련 루틴에는 문제가 없었습니다. 실제 url은 https 를 사용하고 있었는데요. 인증 관련 문제 때문에 이미지를 가져오지 못했네요. ㅠㅠ
아래 인증 메소드를 사용해서 해결했습니다. 에휴~
private static void trustAllHosts()
{
// Create a trust manager that does not validate certificate chains
TrustManager[] trustAllCerts = new TrustManager[]
{
new X509TrustManager()
{
public java.security.cert.X509Certificate[] getAcceptedIssuers()
{
return new java.security.cert.X509Certificate[] {};
}
@Override
public void checkClientTrusted( java.security.cert.X509Certificate[] chain, String authType) throws java.security.cert.CertificateException
{
// TODO Auto-generated method stub
}
@Override
public void checkServerTrusted(
java.security.cert.X509Certificate[] chain,
String authType)
throws java.security.cert.CertificateException
{
// TODO Auto-generated method stub
}
}
};
// Install the all-trusting trust manager
try
{
SSLContext sc = SSLContext.getInstance("TLS");
sc.init(null, trustAllCerts, new java.security.SecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
}
catch (Exception e)
{
e.printStackTrace();
}
}