简体   繁体   English

上载具有不同扩展名Firebase存储的多个文件

[英]Upload multiple file with different extension firebase storage

My goal is to add new product, for each product contain picture and pdf file to firebase storage, then save each link to firebase database. 我的目标是添加新产品,每个产品包含图片和pdf文件到firebase存储,然后将每个链接保存到firebase数据库。

I got a problem went upload a picture and pdf. 我遇到了问题,上传了图片和pdf。 I cant get download URL from each file and return null went I'm try post to database. 我无法从每个文件获取下载URL并返回null所以我尝试发布到数据库。

code: 码:

private void bukafilemanager(View view) {
    switch (view.getId()){
        case R.id.pilih_gambar:
            Intent gambar = new Intent();
            gambar.setType("image/*");
            gambar.setAction(Intent.ACTION_GET_CONTENT);
            startActivityForResult(gambar, PICK_IMAGE_REQUEST);
            break;

        case R.id.pilih_pdf:
            Intent pdf = new Intent();
            pdf.setType("application/*");
            pdf.setAction(Intent.ACTION_GET_CONTENT);
            startActivityForResult(pdf, PICK_FILE_REQUEST);
    }
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == PICK_IMAGE_REQUEST && resultCode == RESULT_OK && data != null && data.getData()!= null){
        URI_Image = data.getData();
        daftarupload.add(URI_Image);
        Glide.with(this).load(URI_Image).into(preview_gambar);
        preview_gambar.setImageURI(URI_Image);

    } else if (requestCode == PICK_FILE_REQUEST && resultCode == RESULT_OK && data != null && data.getData()!= null){
        URI_File = data.getData();
        daftarupload.add(URI_File);
    }
}

public String getMimeType(Context context, Uri uri) {
    String extension;

    //Check uri format to avoid null
    if (uri.getScheme().equals(ContentResolver.SCHEME_CONTENT)) {
        //If scheme is a content
        MimeTypeMap mime = MimeTypeMap.getSingleton();
        extension = mime.getExtensionFromMimeType(context.getContentResolver().getType(uri));
    } else {
        //If scheme is a File
        //This will replace white spaces with %20 and also other special characters. This will avoid returning null values on file name with spaces and special characters.
        extension = MimeTypeMap.getFileExtensionFromUrl(Uri.fromFile(new File(uri.getPath())).toString());
    }
    return extension;
}

protected void uploadfile(ArrayList<Uri> daftarupload){

    progressDialog.setMessage("Harap Tunggu...");
    progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
    progressDialog.setIndeterminate(true);
    progressDialog.setProgress(count);
    progressDialog.setMax(daftarupload.size());
    progressDialog.show();

    String nama_produk = namaproduk.getText().toString();
    String ket_produk = ketproduk.getText().toString();
    if(!TextUtils.isEmpty(nama_produk) && !TextUtils.isEmpty(ket_produk)) {
        for (Uri uri : daftarupload) {
            switch (getMimeType(getBaseContext(), uri)) {
                case "jpg":
                    final StorageReference lokasijpg = storage.child(id_produk + ".jpg");
                    lokasijpg
                            .putFile(uri)
                            .addOnCompleteListener(new OnCompleteListener<UploadTask.TaskSnapshot>() {
                                @Override
                                public void onComplete(@NonNull Task<UploadTask.TaskSnapshot> task) {
                                    if (task.isComplete()){
                                        lokasijpg
                                                .getDownloadUrl()
                                                .addOnSuccessListener(new OnSuccessListener<Uri>() {
                                                    @Override
                                                    public void onSuccess(Uri uri) {
                                                        URL_JPG = uri;
                                                        count += 1;
                                                        progressDialog.setProgress(count);
                                                    }
                                                });
                                    }
                                }
                            });
                    break;
                case "pdf":
                    final StorageReference lokasipdf = storage.child(id_produk + ".pdf");
                    lokasipdf
                            .putFile(uri)
                            .addOnCompleteListener(new OnCompleteListener<UploadTask.TaskSnapshot>() {
                                @Override
                                public void onComplete(@NonNull Task<UploadTask.TaskSnapshot> task) {
                                    if(task.isComplete()){
                                            lokasipdf
                                                    .getDownloadUrl()
                                                    .addOnSuccessListener(new OnSuccessListener<Uri>() {
                                                    @Override
                                                    public void onSuccess(Uri uri) {
                                                        URL_PDF = uri;
                                                        count += 1;
                                                        progressDialog.setProgress(count);
                                                    }
                                                });
                                    }
                                }
                            });
                    break;

                default:
                    progressDialog.dismiss();
                    Toast.makeText(getBaseContext(), "Format Tidak Sesuai", Toast.LENGTH_LONG).show();
                    break;

            }
        }

        simpandata(id_produk, nama_produk, ket_produk , URL_JPG, URL_PDF);
        progressDialog.dismiss();

    } else {
        progressDialog.dismiss();
        Toast.makeText(tambahproduk.this,"Semua data harus diisi lengkap!", Toast.LENGTH_LONG).show();
    }
}

protected void simpandata(String id_produk, final String nama_produk, String ket_produk, Uri URL_JPG, Uri URL_PDF){

        produk produk = new produk(id_produk,nama_produk,ket_produk,URL_JPG.toString(),URL_PDF.toString());
        database.child(id_produk).setValue(produk).addOnSuccessListener(new OnSuccessListener<Void>() {
            @Override
            public void onSuccess(Void aVoid) {
                progressDialog.dismiss();
                Toast.makeText(tambahproduk.this, "Produk "+nama_produk.toString()+" Berhasil Ditambahkan", Toast.LENGTH_LONG).show();
                finish();
            }
        }).addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {
                progressDialog.dismiss();
                Toast.makeText(tambahproduk.this, e.toString(), Toast.LENGTH_LONG).show();
            }
        });
}

error: 错误:

E/AndroidRuntime: FATAL EXCEPTION: main
              Process: com.user.katalog.lulu.user, PID: 27391
              java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.net.Uri.toString()' on a null object reference
                  at com.user.katalog.lulu.user.tambahproduk.simpandata(tambahproduk.java:237)
                  at com.user.katalog.lulu.user.tambahproduk.uploadfile(tambahproduk.java:226)
                  at com.user.katalog.lulu.user.tambahproduk$3.onClick(tambahproduk.java:102)
                  at android.view.View.performClick(View.java:5198)
                  at android.view.View$PerformClick.run(View.java:21147)
                  at android.os.Handler.handleCallback(Handler.java:739)
                  at android.os.Handler.dispatchMessage(Handler.java:95)
                  at android.os.Looper.loop(Looper.java:148)
                  at android.app.ActivityThread.main(ActivityThread.java:5417)
                  at java.lang.reflect.Method.invoke(Native Method)
                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

According to your comment, I understand that you are getting that error because of the following line of code: 根据您的评论,我了解到您由于以下代码行而收到该错误:

produk produk = new produk(id_produk,nama_produk,ket_produk,URL_JPG.toString(),URL_PDF.toString());

It is because you cannot create the URL_PDF varaible as a global variable and expect to work fine. 这是因为您无法将URL_PDF变量创建为全局变量,并且无法正常工作。 You cannot use something now that hasn't been loaded yet. 您现在不能使用尚未加载的内容。 With other words, you cannot simply use the URL_PDF object outside the onComplete() method because it will always be null due the asynchronous behaviour of this method. 换句话说,您不能仅在onComplete()方法外部使用URL_PDF对象,因为由于该方法的异步行为,该对象将始终为null This means that by the time you are trying to use that result outside that method, the data hasn't finished loading yet from the database and that's why is not accessible. 这意味着,当您尝试在该方法之外使用该结果时,数据尚未从数据库中完成加载,因此无法访问。 A quick solve for this problem would be to use the URL_PDF varaible only inside the onComplete() method, otherwise I recommend you see the last part of my anwser from this post in which I have explained how it can be done using a custom callback. 一个快速的解决这个问题是使用的URL_PDF varaible只有内部onComplete()方法,否则我建议你看我anwser从这个最后部分职位中,我已经解释了如何可以使用自定义的回调来完成。 You can also take a look at this video for a better understanding. 您也可以观看此视频 ,以更好地理解。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM