2017-09-26 23 views
0

私はfirebaseストレージに格納されているpdfファイルのURLをノードPdfのデータベースに保存しました。私はデータベースの中に保存されているURLの助けを借りてfirebaseストレージからファイルをダウンロードしようとしています。firebaseデータベースに格納されたURLを使ってファイルをダウンロードする方法は?

public class DownloadFile extends AppCompatActivity{ 
DatabaseReference databaseReference= FirebaseDatabase.getInstance().getReference(); 
String root_child="my book"; 
@Override 
protected void onCreate(@Nullable Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
databaseReference.child("Pdf").addValueEventListener(new ValueEventListener() { 
@Override 
public void onDataChange(DataSnapshot dataSnapshot) { 
if(dataSnapshot.hasChild(root_child)) 
{ 

String url=dataSnapshot.child(root_child).getValue().toString(); 
StorageReference island=storageRef.child("books").child(root_child).child(url); 
island.getFile(file).addOnSuccessListener(new OnSuccessListener<FileDownloadTask.TaskSnapshot>() { 
@Override 
public void onSuccess(FileDownloadTask.TaskSnapshot taskSnapshot) { 
pdfView.fromFile(file).load(); 
} 
}); 
} 

} 

問題は実際にはpdfビュー内には表示されません。私はアプリをデバッグするとき、私はStorageReference island=storageRef.child("books").child(root_child).child(url);が正しい参照を作成していないことがわかりました。要するに、ファイルはダウンロードされていません。ファイル名はユーザーのアップロード内容によって異なるため、ファイル名を指定することはできませんので、urlを使用してファイルを検索できるように'child(url)'を使用しましたが、それが正しい検索方法であるかどうかはわかりません助けていただきありがとうございます。

+0

読みやすいように正しく識別されたコードを投稿してください。 –

+1

あなたはこれを参考にしましたか?https://firebase.google.com/docs/storage/android/download-files – Vij

答えて

0

私は自分自身で解決策を得ました。 StorageReference island=storageRef.child("books").child(root_child).child(url);の代わりにStorageReference island=storage.getReferenceFromUrl(url);を使用しました。これは私の問題を解決しました。

0

デバッグ中に検出されたように、参照が正しくないため、ファイルがダウンロードされていません。

どのファイルをダウンロードするか、どのようにユーザーから情報を取得していますか?

アップロードしたファイルのリストを表示する必要があります。そのリストでは、file_nameに関する情報を保存できます。ユーザーがリスト項目をクリックすると、クリックされたリスト項目からfile_nameを知っているので、正しい参照を持つことができます。

+0

ユーザーは最初に電話からファイルをアップロードし、アップロードしたファイルをPDFビュー内に表示する必要があります。ファイルはfirebaseストレージ内にアップロードされ、URLはデータベース内に保存されますが、同じURLを使用してダウンロードできません。 –

+0

ダウンロードするファイルはどのように決定しますか?ユーザーがアイテムの1つをクリックすると、それがダウンロードされるように、リストビューにアップロードされたファイルのすべてのリストを表示していますか?あなたの提案には –

0

同じ問題で、同じエラーが発生したときに私が使用する別のアプローチを提供します。 外観を与える

    private void downloadFile(final String postKey) { 
        File cFile = new File(getContext().getCacheDir(), "app Directory"); 
        final File cLocalFile = new File(cFile, postKey); 
        if (!rootPath.exists()) { 
         rootPath.mkdirs(); 
        } 
        if (!cFile.exists()) { 
         cFile.mkdirs(); 
        } 
        final FileDownloadTask downloadingTask = mStorage.child(postKey).getFile(cLocalFile); 
        downloadingTaskProgress(downloadingTask, cLocalFile); 
       } 

       private void downloadingTaskProgress(FileDownloadTask downloadingTask, final File cLocalFile) { 
        downloadingTask.addOnProgressListener(new OnProgressListener<FileDownloadTask.TaskSnapshot>() { 
         @Override 
         public void onProgress(final FileDownloadTask.TaskSnapshot taskSnapshot) { 
          double progressSize = (100.0 * taskSnapshot.getBytesTransferred()) 
            /taskSnapshot.getTotalByteCount(); 

         } 
        }).addOnSuccessListener(new OnSuccessListener<FileDownloadTask.TaskSnapshot>() { 
         @Override 
         public void onSuccess(FileDownloadTask.TaskSnapshot taskSnapshot) { 

          Toast.makeText(getActivity(), "File download complete: " + model.fileName, Toast.LENGTH_SHORT).show(); 

          try { 
           writeToStorage(cLocalFile); 
          } catch (IOException e) { 
           e.printStackTrace(); 
          } 
         } 
        }).addOnFailureListener(new OnFailureListener() { 
         @Override 
         public void onFailure(@NonNull Exception exception) { 

          Toast.makeText(getContext(), "local file not created: " + 
            exception.toString(), Toast.LENGTH_LONG).show(); 
         } 
        }); 
       } 

       private void writeToStorage(File src) throws IOException { 
        FileChannel inChannel = new FileInputStream(src).getChannel(); 
        FileChannel outChannel = new FileOutputStream(localFile).getChannel(); 
        try { 
         inChannel.transferTo(0, inChannel.size(), outChannel); 
        } finally { 
         if (inChannel != null) 
          inChannel.close(); 
         if (outChannel != null) 
          outChannel.close(); 
        } 
       } 

があなたの必要性に従って、いくつかの修正を与え、このアプローチのように仕事ができる、実際に私は、ファイルが関連しているにpost_idの名を持つFirebase Storageでファイルを保存し、次のコード に打撃を与えますそれは私のものです...。

+0

thnxです。私はこれを試してみる。 –

+0

試してみて、もし私が働いたら知っている@digital_pro –

関連する問題