Skip to content

Commit 3c9ce62

Browse files
committed
Added getRealPathFromURI
1 parent d6dc2e6 commit 3c9ce62

File tree

3 files changed

+107
-30
lines changed

3 files changed

+107
-30
lines changed

android/src/main/java/io/fullstack/firestack/FirestackStorage.java

+95-30
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
import java.io.FileNotFoundException;
1313

1414
import android.net.Uri;
15+
import android.provider.MediaStore;
16+
import android.database.Cursor;
1517
import android.support.annotation.NonNull;
1618
import android.support.annotation.Nullable;
1719

@@ -80,18 +82,49 @@ public void downloadUrl(final String javascriptStorageBucket,
8082
FirebaseStorage storage = FirebaseStorage.getInstance();
8183
String storageBucket = storage.getApp().getOptions().getStorageBucket();
8284
String storageUrl = "gs://"+storageBucket;
83-
StorageReference storageRef = storage.getReferenceFromUrl(storageUrl);
84-
StorageReference fileRef = storageRef.child(path);
85+
Log.d(TAG, "Storage url " + storageUrl + path);
86+
final StorageReference storageRef = storage.getReferenceFromUrl(storageUrl);
87+
final StorageReference fileRef = storageRef.child(path);
8588

8689
Task<Uri> downloadTask = fileRef.getDownloadUrl();
8790
downloadTask.addOnSuccessListener(new OnSuccessListener<Uri>() {
8891
@Override
8992
public void onSuccess(Uri uri) {
90-
WritableMap res = Arguments.createMap();
93+
final WritableMap res = Arguments.createMap();
94+
9195
res.putString("status", "success");
96+
res.putString("bucket", storageRef.getBucket());
97+
res.putString("fullPath", uri.toString());
9298
res.putString("path", uri.getPath());
93-
res.putString("url", uri.toString());
94-
callback.invoke(null, res);
99+
100+
storageRef.getMetadata()
101+
.addOnSuccessListener(new OnSuccessListener<StorageMetadata>() {
102+
@Override
103+
public void onSuccess(final StorageMetadata storageMetadata) {
104+
Log.d(TAG, "getMetadata success " + storageMetadata);
105+
res.putString("name", storageMetadata.getName());
106+
107+
WritableMap metadata = Arguments.createMap();
108+
metadata.putString("getBucket", storageMetadata.getBucket());
109+
metadata.putString("getName", storageMetadata.getName());
110+
metadata.putDouble("sizeBytes", storageMetadata.getSizeBytes());
111+
metadata.putDouble("created_at", storageMetadata.getCreationTimeMillis());
112+
metadata.putDouble("updated_at", storageMetadata.getUpdatedTimeMillis());
113+
metadata.putString("md5hash", storageMetadata.getMd5Hash());
114+
metadata.putString("encoding", storageMetadata.getContentEncoding());
115+
metadata.putString("downloadUrl", storageMetadata.getDownloadUrl().toString());
116+
117+
res.putMap("metadata", metadata);
118+
callback.invoke(null, res);
119+
}
120+
}).addOnFailureListener(new OnFailureListener() {
121+
@Override
122+
public void onFailure(@NonNull Exception exception) {
123+
Log.e(TAG, "Failure in download " + exception);
124+
callback.invoke(makeErrorPayload(1, exception));
125+
}
126+
});
127+
95128
}
96129
}).addOnFailureListener(new OnFailureListener() {
97130
@Override
@@ -144,20 +177,7 @@ public void onFailure(@NonNull Exception exception) {
144177
public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
145178
Log.d(TAG, "Successfully uploaded file " + taskSnapshot);
146179
// taskSnapshot.getMetadata() contains file metadata such as size, content-type, and download URL.
147-
Uri downloadUrl = taskSnapshot.getDownloadUrl();
148-
StorageMetadata d = taskSnapshot.getMetadata();
149-
150-
WritableMap resp = Arguments.createMap();
151-
resp.putString("downloadUrl", downloadUrl.toString());
152-
resp.putString("fullPath", d.getPath());
153-
resp.putString("bucket", d.getBucket());
154-
resp.putString("name", d.getName());
155-
156-
WritableMap metadataObj = Arguments.createMap();
157-
metadataObj.putString("cacheControl", d.getCacheControl());
158-
metadataObj.putString("contentDisposition", d.getContentDisposition());
159-
metadataObj.putString("contentType", d.getContentType());
160-
resp.putMap("metadata", metadataObj);
180+
WritableMap resp = getDownloadData(taskSnapshot);
161181
// NSDictionary *props = @{
162182
// @"fullPath": ref.fullPath,
163183
// @"bucket": ref.bucket,
@@ -171,13 +191,18 @@ public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
171191
.addOnProgressListener(new OnProgressListener<UploadTask.TaskSnapshot>() {
172192
@Override
173193
public void onProgress(UploadTask.TaskSnapshot taskSnapshot) {
174-
double progress = (100.0 * taskSnapshot.getBytesTransferred()) / taskSnapshot.getTotalByteCount();
175-
System.out.println("Upload is " + progress + "% done");
176-
177-
WritableMap data = Arguments.createMap();
178-
data.putString("eventName", "upload_progress");
179-
data.putDouble("progress", progress);
180-
FirestackUtils.sendEvent(mReactContext, "upload_progress", data);
194+
double totalBytes = taskSnapshot.getTotalByteCount();
195+
double bytesTransferred = taskSnapshot.getBytesTransferred();
196+
double progress = (100.0 * bytesTransferred) / totalBytes;
197+
198+
System.out.println("Transferred " + bytesTransferred + "/" + totalBytes + "("+progress + "% complete)");
199+
200+
if (progress >= 0) {
201+
WritableMap data = Arguments.createMap();
202+
data.putString("eventName", "upload_progress");
203+
data.putDouble("progress", progress);
204+
FirestackUtils.sendEvent(mReactContext, "upload_progress", data);
205+
}
181206
}
182207
}).addOnPausedListener(new OnPausedListener<UploadTask.TaskSnapshot>() {
183208
@Override
@@ -193,14 +218,54 @@ public void onPaused(UploadTask.TaskSnapshot taskSnapshot) {
193218
});
194219
}
195220
catch (Exception ex) {
196-
WritableMap err = Arguments.createMap();
197-
198-
err.putString("error", "FileNotFoundException");
221+
callback.invoke(makeErrorPayload(2, ex));
222+
}
223+
}
199224

200-
callback.invoke(err);
225+
@ReactMethod
226+
public void getRealPathFromURI(final String uri, final Callback callback) {
227+
try {
228+
Context context = getReactApplicationContext();
229+
String [] proj = {MediaStore.Images.Media.DATA};
230+
Cursor cursor = context.getContentResolver().query(Uri.parse(uri), proj, null, null, null);
231+
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
232+
cursor.moveToFirst();
233+
String path = cursor.getString(column_index);
234+
cursor.close();
235+
236+
callback.invoke(null, path);
237+
} catch (Exception ex) {
238+
ex.printStackTrace();
239+
callback.invoke(makeErrorPayload(1, ex));
201240
}
202241
}
203242

243+
private WritableMap getDownloadData(final UploadTask.TaskSnapshot taskSnapshot) {
244+
Uri downloadUrl = taskSnapshot.getDownloadUrl();
245+
StorageMetadata d = taskSnapshot.getMetadata();
246+
247+
WritableMap resp = Arguments.createMap();
248+
resp.putString("downloadUrl", downloadUrl.toString());
249+
resp.putString("fullPath", d.getPath());
250+
resp.putString("bucket", d.getBucket());
251+
resp.putString("name", d.getName());
252+
253+
WritableMap metadataObj = Arguments.createMap();
254+
metadataObj.putString("cacheControl", d.getCacheControl());
255+
metadataObj.putString("contentDisposition", d.getContentDisposition());
256+
metadataObj.putString("contentType", d.getContentType());
257+
resp.putMap("metadata", metadataObj);
258+
259+
return resp;
260+
}
261+
262+
private WritableMap makeErrorPayload(double code, Exception ex) {
263+
WritableMap error = Arguments.createMap();
264+
error.putDouble("code", code);
265+
error.putString("message", ex.getMessage());
266+
return error;
267+
}
268+
204269
// Comes almost directory from react-native-fs
205270
@Override
206271
public Map<String, Object> getConstants() {

ios/Firestack/FirestackStorage.m

+8
Original file line numberDiff line numberDiff line change
@@ -256,6 +256,14 @@ - (void) addUploadObservers:(FIRStorageUploadTask *) uploadTask
256256
}}];
257257
}
258258

259+
// Compatibility with the android library
260+
// For now, just passes the url path back
261+
RCT_EXPORT_METHOD(getRealPathFromURI: (NSString *) urlStr
262+
callback:(RCTResponseSenderBlock) callback)
263+
{
264+
callback(@[[NSNull null], urlStr}]);
265+
}
266+
259267
// This is just too good not to use, but I don't want to take credit for
260268
// this work from RNFS
261269
// https://github.com/johanneslumpe/react-native-fs/blob/master/RNFSManager.m

lib/modules/storage.js

+4
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,10 @@ export class Storage extends Base {
9393
});
9494
}
9595

96+
getRealPathFromURI(uri) {
97+
return promisify('getRealPathFromURI', FirestackStorage)(uri);
98+
}
99+
96100
_addListener(evt, cb) {
97101
return FirestackStorageEvt.addListener(evt, cb);
98102
}

0 commit comments

Comments
 (0)