우물안에서 보는 하늘도 맑다

[d님 질문] Firebase 에 Storage에 이미지 파일을 올리고, imgUrl과 Data를 Firebase에 업로드 하다 오류발생(StorageException,Could not get object) 본문

경단녀에서 "나"로 돌아가기/안드로이드

[d님 질문] Firebase 에 Storage에 이미지 파일을 올리고, imgUrl과 Data를 Firebase에 업로드 하다 오류발생(StorageException,Could not get object)

몽염이 2021. 2. 18. 13:40
반응형

* 오류메세지

   
  2021-02-18 13:22:15.192 3726-5186/com.bliss.csc.agmhealing E/StorageException: StorageException has occurred.
Object does not exist at location.
Code: -13010 HttpResult: 404
2021-02-18 13:22:15.194 3726-5186/com.bliss.csc.agmhealing E/StorageException: { "error": { "code": 404, "message": "Not Found. Could not get object", "status": "GET_OBJECT" }}
java.io.IOException: { "error": { "code": 404, "message": "Not Found. Could not get object", "status": "GET_OBJECT" }}
at com.google.firebase.storage.network.NetworkRequest.parseResponse(NetworkRequest.java:434)
at com.google.firebase.storage.network.NetworkRequest.parseErrorResponse(NetworkRequest.java:451)
at com.google.firebase.storage.network.NetworkRequest.processResponseStream(NetworkRequest.java:442)
at com.google.firebase.storage.network.NetworkRequest.performRequest(NetworkRequest.java:272)
at com.google.firebase.storage.network.NetworkRequest.performRequest(NetworkRequest.java:286)
at com.google.firebase.storage.internal.ExponentialBackoffSender.sendWithExponentialBackoff(ExponentialBackoffSender.java:70)
at com.google.firebase.storage.internal.ExponentialBackoffSender.sendWithExponentialBackoff(ExponentialBackoffSender.java:62)
at com.google.firebase.storage.GetDownloadUrlTask.run(GetDownloadUrlTask.java:76)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.lang.Thread.run(Thread.java:923)

 

* 해결방법

- 스토리지 파일을 올리려고 열어둔 uploadTask에서 이미지 파일을 업로드 한후,

실패 메세지와 성공 메세지를 받아서

실제 저장된(downUrl)을 받아 Firebase에 입력(Insert)하는 흐름이 다음으로 이어지는데

질문 주신 부분에  url을 받아오는 메소드에 addOnSuccessListener 리스너는 정상 적으로 동작하지 않으며

이미 끝난 uploadTask 객체를 참조하게 되면

위 에러 메세지와 같이 Not Found. Could not get object

찾을 수 없는 object 즉 객체를 참조 했다는 에러가 확인 됩니다

**** 아래 개발자 문서를 참조해서 수정 하시면 정상 동작 할 꺼예요

**** 하지만 저도 downloadUrl을 받아오는 데는 성공했으나,

받아온 Url과 실제 스토리지 Url과 달라서 이미지가 보이지 않는 에러를 가지고 있습니다

저도 아직 해결 못 한 부분이라 이는 해결되면 블로그에 올리겠습니다

 

  WriteActivity.java
D
님 코

194번줄 부터~224줄 소스
if(mList.size() > 0)
{
//이미지를 업로드를 할 경우
int imageCount = 0;
for (ContentData cdata : mList)
{
ByteArrayOutputStream baos = new ByteArrayOutputStream();
cdata.Bmp.compress(Bitmap.CompressFormat.JPEG, 100, baos);
byte[] data = baos.toByteArray();

mountainsRef = storageRef.child("board/"+ image_time + "_" + imageCount + ".jpg");

UploadTask uploadTask = mountainsRef.putBytes(data);
uploadTask.addOnFailureListener(new OnFailureListener(){
@Override
public void onFailure(@NonNull Exception exception){
//실패
idata.image += "none,";
}
});
mountainsRef.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
@Override
public void onSuccess(Uri downloadUrl) {
idata.image += downloadUrl.toString() + ",";

doInsert(idata, true);
}
});
imageCount++;
}
}









서 중

참고 URL : firebase.google.com/docs/storage/android/upload-files?authuser=0

// Get the data from an ImageView as bytes
imageView.setDrawingCacheEnabled(true);
imageView.buildDrawingCache();
Bitmap bitmap = ((BitmapDrawable) imageView.getDrawable()).getBitmap();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);
byte[] data = baos.toByteArray();

UploadTask uploadTask = mountainsRef.putBytes(data);
uploadTask.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception exception) {
// Handle unsuccessful uploads
}
}).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
@Override
public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
// taskSnapshot.getMetadata() contains file metadata such as size, content-type, etc.
// ...
}
});

반응형