flutter - 使用 Flutter (iOS/Android) 将图像上传到 Azure blob
问题描述
我们如何将图像(.jpg、.png)上传到 Azure blob 存储。开始时没有任何见解。
如果您使用过示例,很想看看并尝试这样做,任何有效的示例/网址都将有助于开始
这是我正在尝试上传 .jpg 文件并收到 400 错误,
image.forEach((element) async {
ImageDetailsUpload result = ImageDetailsUpload.fromJson(element);
var postUri = Uri.parse('$url/${result.fileName}?$code'); //Azure blob url
var request = new http.MultipartRequest("PUT", postUri); //Put method
request.files.add(
new http.MultipartFile.fromBytes(
'file',
await File.fromUri(Uri.parse(result.path)).readAsBytes(),
),
);
request.send().then((response) {
print(response.statusCode);
}, onError: (err) {
print(err);
});
});
图像是一个列表并保存文件名和文件路径,这是我得到的字节(见下图)
解决了上传问题,但现在服务器上的图像已损坏 -
image.forEach((element) async {
ImageDetailsUpload result = ImageDetailsUpload.fromJson(element);
var postUri = Uri.parse('$url/${result.fileName}?$code');
var request = new http.MultipartRequest("PUT", postUri);
request.headers['X-MS-BLOB-TYPE'] = 'BlockBlob';
request.files.add(
new http.MultipartFile.fromBytes(
'file',
await File.fromUri(Uri.parse(result.path)).readAsBytes(),
),
);
request.send().then((response) {
print(response.statusCode);
}, onError: (err) {
print(err);
});
});
这似乎困扰着我。
还有更多问题,我注意到使用邮递员上传到 blob 存储的文件存储为类型的实际图像,image/jpeg
具体取决于我上传的图像类型。但是当使用应用程序上传时,我使用的是 mutipart,它使存储的文件成为 type multipart/form-data
。上传两种类型的图像 jpg/png 都给出了上面提到的类型。
[![在此处输入图像描述][3]][3]
解决方案
首先,将图像转换File
为Stream
数据将以流的形式推送到 blob 容器。
Future uploadImage(File file) async {
String fileName = file.path.split('/').last;
_logger.info("File Path: " + fileName);
String imageToken = "Get your own token";
String containerName = "Blob container name";
final fileBytes = file.readAsBytesSync();
var streamData = Stream.fromIterable(fileBytes.map((e) => [e]));
String uploadDestinationUrl = RollaConstants.HOST_IMAGE +
"/$containerName" +
"/$fileName" +
imageToken;
final Dio _dio = Dio();
Response response;
try {
response = await _dio.put(uploadDestinationUrl,
data: streamData,
options: Options(headers: {
Headers.contentLengthHeader: fileBytes.length,
"x-ms-blob-type": "BlockBlob",
"content-type": "image/jpeg"
}));
} catch (error, stacktrace) {
print("Exception occured: $error.response stackTrace: $stacktrace");
}
print("Blob response: " + response.statusCode.toString());
}
推荐阅读
- javascript - 我很想在 javascript 中将多个图像下载为 zip 文件
- android - 当我从 Xamarin.Android 中的静态快捷方式启动应用程序时,未安装应用程序
- reactjs - 使用公共 IP 访问在 Azure vm 中运行的 webapp 时出错
- angular - 根据单选按钮值动态禁用角垫单选复选框
- java - 非 html 方法 Spring MVC
- git - 排除 ftp-deploy 中的密钥故障
- c# - Xamarin Forms 在 Shell 页面内显示选取器
- http - 一个电子邮件应用程序使用不同的端口
- mongoose - Graphql 使用猫鼬解析信息
- python - AttributeError:“NoneType”对象在 Python 3 中使用 beautifulsoup 没有属性“get”