java - 是否可以一次将多个文件上传到 Firebase 存储
问题描述
******编辑******
事实证明,您可以在一个实例中上传多个文件。我使用了下面的代码。所有文件都上传了,但由于某种原因在应用程序内它只在上传的项目回收视图中显示一个项目。有人可以通过n pehaps快速检查一下,请解释原因
recycle_item.xml
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:orientation="horizontal"
android:padding="10dp"
android:weightSum="10">
<ImageView
android:id="@+id/upload_icon"
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_weight="2"
android:src="@drawable/ic_attach_file_black_24dp"/>
<TextView
android:id="@+id/upload_filename"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_weight="6"
android:gravity="center_vertical"
android:text="Filename.type"
android:textSize="16sp" />
photoUploader 类
initVariables();
}
private void initVariables() {
mStorage = FirebaseStorage.getInstance().getReference();
mSelectBtn = findViewById(R.id.select_btn);
mUploadList = findViewById(R.id.upload_list);
mUploadList = (RecyclerView) findViewById(R.id.upload_list);
fileNameList = new ArrayList<>();
fileDoneList = new ArrayList<>();
uploadListAdapter = new UploadListAdapter(fileNameList, fileDoneList);
//RecyclerView
mUploadList.setLayoutManager(new LinearLayoutManager(this));
mUploadList.setHasFixedSize(true);
mUploadList.setAdapter(uploadListAdapter);
mSelectBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
chooseImage();
}
});
}
private void chooseImage() {
Intent intent = new Intent();
intent.setType("image/*");
intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent,"Select Picture"),
RESULT_LOAD_IMAGE);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent
data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode == RESULT_LOAD_IMAGE && resultCode == RESULT_OK){
if(data.getClipData() != null){
int totalItemsSelected = data.getClipData().getItemCount();
for(int i = 0; i < totalItemsSelected; i++){
Uri fileUri = data.getClipData().getItemAt(i).getUri();
String fileName = getFileName(fileUri);
fileNameList.add(fileName);
fileDoneList.add("uploading");
uploadListAdapter.notifyDataSetChanged();
Date myDate = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
final String myDateString = sdf.format(myDate);
String Gap ="/";
StorageReference fileToUpload = mStorage.child(myDateString+Gap+ UUID.randomUUID().toString());
final int finalI = i;
fileToUpload.putFile(fileUri).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
@Override
public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
FirebaseDatabase sb = FirebaseDatabase.getInstance();
DatabaseReference rootRef = sb.getReference().child("PreviousJobs");
rootRef
.child(myDateString)
.setValue(myDateString);
fileDoneList.remove(finalI);
fileDoneList.add(finalI, "done");
uploadListAdapter.notifyDataSetChanged();
}
});
}
//Toast.makeText(MainActivity.this, "Selected Multiple Files", Toast.LENGTH_SHORT).show();
} else if (data.getData() != null){
Toast.makeText(photoUploader.this, "Selected Single File", Toast.LENGTH_SHORT).show();
}
}
}
public String getFileName(Uri uri) {
String result = null;
if (uri.getScheme().equals("content")) {
Cursor cursor = getContentResolver().query(uri, null, null, null,
null);
try {
if (cursor != null && cursor.moveToFirst()) {
result =
cursor.getString(cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME));
}
} finally {
cursor.close();
}
}
if (result == null) {
result = uri.getPath();
int cut = result.lastIndexOf('/');
if (cut != -1) {
result = result.substring(cut + 1);
}
}
return result;
}
最后是适配器类
public List<String> fileNameList;
public List<String> fileDoneList;
public UploadListAdapter(List<String> fileNameList, List<String>fileDoneList){
this.fileDoneList = fileDoneList;
this.fileNameList = fileNameList;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.recycle_item, parent, false);
return new ViewHolder(v);
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
String fileName = fileNameList.get(position);
holder.fileNameView.setText(fileName);
String fileDone = fileDoneList.get(position);
if(fileDone.equals("uploading")){
holder.fileDoneView.setImageResource(R.drawable.progress);
} else {
holder.fileDoneView.setImageResource(R.drawable.checked);
}
}
@Override
public int getItemCount() {
return fileNameList.size();
}
public class ViewHolder extends RecyclerView.ViewHolder {
View mView;
public TextView fileNameView;
public ImageView fileDoneView;
public ViewHolder(View itemView) {
super(itemView);
mView = itemView;
fileNameView = (TextView) mView.findViewById(R.id.upload_filename);
fileDoneView = (ImageView) mView.findViewById(R.id.upload_loading);
}
}
}
解决方案
Firebase Android SDK中没有内置任何用于发送批次的内容。但是,您可以直接使用 Google Cloud Storage API 发送批量请求,尽管它有点复杂。
如果你想走这条路,你需要知道的第一件事是你的 Firebase 存储“桶”的 id。如此处所述,您可以不使用存储桶名称gs://
并将其传递到 GCS 资源中。
例如,如果我的存储桶是,gs://kato-sandbox.appspot.com
那么我使用kato-sandbox.appspot.com
.
要在 Firebase 中查找您的存储桶名称,请访问您在 console.firebase.google.com 中的存储页面并查看列出的 URL。
推荐阅读
- java - groovy.lang.MissingPropertyException:无法获取未知属性
- mysql - 如何正确安装mysql
- java - 对于 Apache poi 折线图,如何使第一列不显示在 y 轴上
- javascript - 更改 CSS 中的复选框样式
- java - 数组输入未加起来。-- 总计 += scoreArray[i];
- javascript - 有没有办法在没有 create-react-app 的情况下在 React 中导入模块?
- python - 如何在numpy中将具有非零累积和的n个连续元素设置为1,其余元素设置为零?
- javascript - 使用 axios 反应和节点跨域错误
- android - Socket.io Emitter.Listener() 在 Android 9(API 级别 28)上不起作用
- flutter - 无法在真实设备上启动颤振应用程序