'Firebase - StorageException: StorageException has occurred -> Object does not exist at location
What I'm basically trying to do here is get an image from the phone, choose it, show it on the screen, and upload it to the Firebase storage.
After looking at a lot of other answers on the internet and even here, I still couldn't understand why that UploadFile function still doesn't work.
for now, I implemented a progress bar (while on progress) on failure toast and if the user didn't choose an image I also created a toast.
but something is getting wrong with the OnSuccess all I have commented out all the irrelevant things and left only the toast message and still it doesn't work and getting me the exception.
Here is the code:
public class PhotoActivity extends AppCompatActivity {
//using this videos:
//https://www.youtube.com/watch?v=MfCiiTEwt3g&list=PLrnPJCHvNZuB_7nB5QD-4bNg6tpdEUImQ
private static final int PICK_IMAGE_REQUEST =1;
private Button mButtonChooseImage;
private Button mButtonUpload;
private EditText mImageTitel;
private ImageView mImageView;
private ProgressBar mProgressBar;
private Uri mImageUri;
private StorageReference mStorageRef;
private DatabaseReference mDatabaseRef;
@Override
protected void onCreate(Bundle savedInstanceState) {
Log.i( "PhotoActivity","created activity");
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_photo);
//cosmetics for splash screen
getSupportActionBar().hide();
mButtonChooseImage = findViewById(R.id.choose_image);
mButtonUpload = findViewById(R.id.image_upload);
mImageTitel = findViewById(R.id.image_titel_text);
mImageView = findViewById(R.id.image_view);
mProgressBar = findViewById(R.id.progress_bar);
mStorageRef = FirebaseStorage.getInstance().getReference("uploads");
mDatabaseRef = FirebaseDatabase.getInstance().getReference("uploads");
mButtonChooseImage.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.i( "PhotoActivity","clicked on chooseImageButton");
//create new intent and preper it to send for opening new activity for choosing the window.
Intent intent = new Intent();
intent.setAction(Intent.ACTION_GET_CONTENT);
intent.setType("image/*");
Log.i( "PhotoActivity","created intent");
someActivityResultLauncher.launch(intent);
}
});
mButtonUpload.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.i( "PhotoActivity","clicked on buttonUpload");
uploadFile();
}
});
}
// creating new activity for the image choose window.
ActivityResultLauncher<Intent> someActivityResultLauncher = registerForActivityResult(
new ActivityResultContracts.StartActivityForResult(),
new ActivityResultCallback<ActivityResult>() {
@Override
public void onActivityResult(ActivityResult result) {
Log.i( "PhotoActivity","in Result Launcher");
if (result.getResultCode() == Activity.RESULT_OK) {
// There are no request codes
Intent data = result.getData();
mImageUri = data.getData();
//Load Image had to be in a function outside of the ActivityResult becouse of the "this" statment"
LoadImage();
}
}
});
private void LoadImage(){
Picasso.with(this).load(mImageUri).into(mImageView);
}
//getting the file extension (.jpg / .png) and such.
private String getFileExtension(Uri uri ){
ContentResolver cR = getContentResolver();
MimeTypeMap mime = MimeTypeMap.getSingleton();
return mime.getExtensionFromMimeType(cR.getType(uri));
}
private void uploadFile(){
if (mImageUri != null){
//uploading the image to storage with the name in milliseconds (thats how we use uniq name).
StorageReference fileReference = mStorageRef.child(System.currentTimeMillis()+ "." + getFileExtension(mImageUri));
fileReference.putFile(mImageUri)
.addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
@Override
public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
//after 5 seconds get the progress bur to 0 again.
/*
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
mProgressBar.setProgress(0);
}
}, 5000);
*/
Toast.makeText(PhotoActivity.this, "Upload sucseesful", Toast.LENGTH_LONG).show();
//UploadImage upload = new UploadImage(mImageTitel.getText().toString().trim(), fileReference.getDownloadUrl().toString());
//String uploadID = mDatabaseRef.push().getKey();
// mDatabaseRef.child(uploadID).setValue(upload);
}
})
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Toast.makeText(PhotoActivity.this, e.getMessage(), Toast.LENGTH_LONG).show();
}
})
.addOnProgressListener(new OnProgressListener<UploadTask.TaskSnapshot>() {
@Override
public void onProgress(@NonNull UploadTask.TaskSnapshot snapshot) {
double progress = (100.0 * snapshot.getBytesTransferred() / snapshot.getTotalByteCount());
mProgressBar.setProgress((int) progress);
}
});
}else{
Toast.makeText(this, "Please Select Image", Toast.LENGTH_LONG).show();
}
}
}
The Exception log:
2022-03-17 07:50:23.700 8153-8489/com.example.gesti_app E/StorageException: StorageException has occurred.
Object does not exist at location.
Code: -13010 HttpResult: 404
2022-03-17 07:50:23.701 8153-8489/com.example.gesti_app E/StorageException: The server has terminated the upload session
java.io.IOException: The server has terminated the upload session
at com.google.firebase.storage.UploadTask.serverStateValid(UploadTask.java:339)
at com.google.firebase.storage.UploadTask.shouldContinue(UploadTask.java:308)
at com.google.firebase.storage.UploadTask.run(UploadTask.java:229)
at com.google.firebase.storage.StorageTask.lambda$getRunnable$7$com-google-firebase-storage-StorageTask(StorageTask.java:1072)
at com.google.firebase.storage.StorageTask$$ExternalSyntheticLambda3.run(Unknown Source:2)
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)
Caused by: java.io.IOException: { "error": { "code": 404, "message": "Not Found." }}
at com.google.firebase.storage.network.NetworkRequest.parseResponse(NetworkRequest.java:445)
at com.google.firebase.storage.network.NetworkRequest.parseErrorResponse(NetworkRequest.java:462)
at com.google.firebase.storage.network.NetworkRequest.processResponseStream(NetworkRequest.java:453)
at com.google.firebase.storage.network.NetworkRequest.performRequest(NetworkRequest.java:272)
at com.google.firebase.storage.network.NetworkRequest.performRequest(NetworkRequest.java:289)
at com.google.firebase.storage.internal.ExponentialBackoffSender.sendWithExponentialBackoff(ExponentialBackoffSender.java:76)
at com.google.firebase.storage.internal.ExponentialBackoffSender.sendWithExponentialBackoff(ExponentialBackoffSender.java:68)
at com.google.firebase.storage.UploadTask.sendWithRetry(UploadTask.java:477)
at com.google.firebase.storage.UploadTask.beginResumableUpload(UploadTask.java:276)
at com.google.firebase.storage.UploadTask.run(UploadTask.java:224)
at com.google.firebase.storage.StorageTask.lambda$getRunnable$7$com-google-firebase-storage-StorageTask(StorageTask.java:1072)
at com.google.firebase.storage.StorageTask$$ExternalSyntheticLambda3.run(Unknown Source:2)
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)
2022-03-17 07:50:23.701 8153-8489/com.example.gesti_app
Thanks a lot!
Solution 1:[1]
I found solution, when i got to know that i have to give complete path of an image:
storageReference.child("users").child(userID).child("screenshot")
.child(imagePath).getFile(localFile)
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | Frank van Puffelen |
