I want to download image on firebase
storage in android app.
this is my image
I try this but it is not working
storageR
// Create a storage reference from our app
StorageReference storageRef = storage.getReference();
// Or Create a reference to a file from a Google Cloud Storage URI
StorageReference gsReference =
storage.getReferenceFromUrl("gs://bucket/images/stars.jpg");
/*In this case we'll use this kind of reference*/
//Download file in Memory
StorageReference islandRef = storageRef.child("images/island.jpg");
final long ONE_MEGABYTE = 1024 * 1024;
islandRef.getBytes(ONE_MEGABYTE).addOnSuccessListener(new
OnSuccessListener<byte[]>() {
@Override
public void onSuccess(byte[] bytes) {
// Data for "images/island.jpg" is returns, use this as needed
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception exception) {
// Handle any errors
}
});
package com.example.package.myfirestore;
import android.app.ProgressDialog;
import android.content.ContentResolver;
import android.content.Intent;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.webkit.MimeTypeMap;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import com.google.android.gms.tasks.OnFailureListener;
import com.google.android.gms.tasks.OnSuccessListener;
import com.google.firebase.firestore.FirebaseFirestore;
import com.google.firebase.storage.FirebaseStorage;
import com.google.firebase.storage.OnProgressListener;
import com.google.firebase.storage.StorageReference;
import com.google.firebase.storage.UploadTask;
import java.io.IOException;
import java.net.URI;
/**
* Created by Yeshveer on 6/9/2018.
*/
public class UploadImg extends AppCompatActivity{
private TextView textView1;
private ImageView img1;
private EditText edittext1;
private Button Btn1;
private Button Btn2;
int Image_requestcode=7;
ProgressDialog pd;
Uri filpath;
FirebaseStorage storage1;
StorageReference storageReference;
StorageReference storageReference2;
FirebaseFirestore db;
FirebaseStorage storage;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView1 = (TextView) findViewById(R.id.textView1);
img1 = (ImageView) findViewById(R.id.img1);
edittext1 = (EditText) findViewById(R.id.edittext1);
Btn1 = (Button) findViewById(R.id.Btn1);
Btn2 = (Button) findViewById(R.id.Btn2);
// Create Storage Referece
storage1=FirebaseStorage.getInstance();
storageReference = storage1.getReference();
//PD details
pd=new ProgressDialog(this);
pd.setTitle("Uploading Image");
// Image Chooser
Btn1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// Creating Intent
Intent intent = new Intent();
//Setting Intent of Image type and select Image from Mobile Storage
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent, "Please Select Image"), Image_requestcode);
}
});
Btn2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
UploadingStart();
}
});
}
private void UploadingStart() {
// Image path Print
textView1.setText(GetFileExtension(filpath));
pd.show();
storageReference2=storageReference.child("images/"+"hello"+"."+GetFileExtension(filpath));
storageReference2.putFile(filpath)
.addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
@Override
public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
pd.dismiss();
Toast.makeText(UploadImg.this, "Uploaded Successfully", Toast.LENGTH_SHORT).show();
}
})
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
pd.dismiss();
Toast.makeText(UploadImg.this, "Error in Uploading, Please check Internet connection", Toast.LENGTH_SHORT).show();
}
})
.addOnProgressListener(new OnProgressListener<UploadTask.TaskSnapshot>() {
@Override
public void onProgress(UploadTask.TaskSnapshot taskSnapshot) {
double progress=(100.0* taskSnapshot.getBytesTransferred()/taskSnapshot.getTotalByteCount());
pd.setMessage("Progress is "+(int)progress+"%");
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode==Image_requestcode && resultCode==RESULT_OK && data != null && data.getData() != null){
filpath=data.getData();
try {
// Image content resolver
Bitmap bitmap= MediaStore.Images.Media.getBitmap(getContentResolver(),filpath);
img1.setImageBitmap(bitmap);
} catch (IOException e) {
e.printStackTrace();
}
}
}
// Method for file etention and path
public String GetFileExtension(Uri uri){
ContentResolver contentResolver=getContentResolver();
MimeTypeMap mimeTypeMap=MimeTypeMap.getSingleton();
// Return file Extension
return mimeTypeMap.getExtensionFromMimeType(contentResolver.getType(uri));
}
}
I'm a little late on this question. I encountered this same problem, but getting the URL (ie: getDownloadUrl()
as shown in the Firebase docs) for the file doesn't address the entire problem which is downloading the file.
This is because sending a download (or attachment) response to the browser requires the file content (not the URL). In order to get the URL and obtain the actual file content requires an HTTP request which isn't an option for us using the free Spark Firebase account.
To get around this, I used the download()
method from the storage bucket which allowed me save the storage file as a local tmp file. Then I used an fs read stream to pipe the file content to the cloud function response...
const fireapp = '<thebucket>.appspot.com';
const gcs = require('@google-cloud/storage')({keyFilename:'serviceAccount.json'});
const bucket = gcs.bucket(fireapp);
// storage path
let fn = 'folder/theimage.png';
// allow CORS
res.set('Access-Control-Allow-Origin', '*');
// download w/o external http request
// by download file from bucket
// and saving to tmp folder
const tempFilePath = path.join(os.tmpdir(), "tmpfile.jpg");
bucket.file(fn).download({destination: tempFilePath}).then(()=>{
console.log('Image downloaded locally to', tempFilePath);
var filestream = fs.createReadStream(tempFilePath);
filestream.pipe(response);
});
Try this
// Create a storage reference from our app
StorageReference storageRef = storage.getReferenceFromUrl("gs://<your-bucket-name>");
// Create a reference with an initial file path and name
StorageReference pathReference = storageRef.child("users/me/yourpics.png");
storageRef.child("users/me/yourpics.png").getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
@Override
public void onSuccess(Uri uri) {
// Got the download URL for 'users/me/profile.png'
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception exception) {
// Handle any errors
}
});
Download-files
https://firebase.google.com/docs/storage/android/download-files
To download a file, first create a Cloud Storage reference to the file you want to download.
You can create a reference by appending child paths to the storage root, or you can create a reference from an existing gs://
or https:// URL
referencing an object in Cloud Storage.
// Create a storage reference from our app
StorageReference storageRef = storage.getReference();
// Create a reference with an initial file path and name
StorageReference pathReference = storageRef.child("images/stars.jpg");
images
is the child of root.
storageRef.child("images/stars.jpg").getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
@Override
public void onSuccess(Uri uri) {
// Got the download URL for 'users/me/profile.png'
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception exception) {
// Handle any errors
}
});