我的目标是将图片放入资源文件夹中,稍后将其上传到Firebase存储。由于图像文件将与应用程序一起打包,我需要使用Firebase的putStream方法来上传文件。但是,我无法将图像文件读入流。
我尝试过的事情:
public static InputStream readAssetsFileToStream(String fileName, Context context) {
AssetManager assManager = context.getAssets();
InputStream is = null;
try {
is = assManager.open(fileName);
} catch (Exception e) {
e.getMessage();
} finally {
try {
if (is != null)
is.close();
} catch (Exception e2) {
e2.getMessage();
}
}
InputStream isOutput = new BufferedInputStream(is);
return isOutput;
}
然后需要上传文件的位置:
public void uploadFile() throws IOException {
Log.i("Firebase", "Upload started!");
InputStream is = readAssetsFileToStream("abc", getApplicationContext());
int size = is.available();
byte[] buffer = new byte[size]; //declare the size of the byte array with size of the file
is.read(buffer); //read file
is.close(); //close file
String streamData = new String(buffer);
// Uri file = Uri.fromFile(new File("path/to/raw/book.pdf"));sourc
// StorageReference riversRef = mStorageRef.child("/quadcopter.pdf");
mStorageRef.putStream(is)
.addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
@Override
public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
// Get a URL to the uploaded content
Uri downloadUrl = taskSnapshot.getDownloadUrl();
Log.i("Firebase", downloadUrl.toString());
Log.i("Firebase", "Upload Successful!");
}
})
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception exception) {
Log.i("Firebase", "Upload failed");
Log.i("Firebase", exception.getMessage());
// ...
}
}).addOnCompleteListener(new OnCompleteListener<UploadTask.TaskSnapshot>() {
@Override
public void onComplete(@NonNull Task<UploadTask.TaskSnapshot> task) {
Log.i("Firebase", "Upload Complete!");
}
}).addOnProgressListener(new OnProgressListener<UploadTask.TaskSnapshot>() {
@Override
public void onProgress(UploadTask.TaskSnapshot taskSnapshot) {
Log.i("Firebase", String.valueOf(taskSnapshot.getBytesTransferred()));
}
});
}
上传文件时,我收到错误:
int size = is.available();
说,
java.io.IOException: BufferedInputStream is closed
我的项目结构:
我需要上传&#39; abc.jpg&#39;文件。非常感谢任何帮助。
答案 0 :(得分:1)
在readAssetsFileToStream
的finally块中关闭流:
finally {
try {
if (is != null)
is.close();
} catch (Exception e2) {
e2.getMessage();
}
你总是返回一个封闭的流。可用性检查正确返回流已关闭。顺便说一句:你只能处理一次流。
由于AssetsManager.open()是自动关闭的,你可以写:
try(InputStream is = assManager.open(fileName)) {}
删除finally块。这将在使用后自动关闭您的流。
但我建议你进行重构。返回流总是让您在解决问题时遇到困难。根据您的需要,您可以将其作为文件或字节[]返回。两者都有优势和问题。