我需要能够从私有服务器下载并显示图像。我发送的请求需要包含一个带有content-type的标头和一个带有sessionToken和userId的正文。 服务器以Content-type application / octet-stream的二进制流作为响应。
这是我现在拥有的代码:
Future<Null> _downloadFile(String url, String userId, sessionToken) async {
Map map = {'token': sessionToken, 'UserId': userId};
try {
var request = await httpClient.getUrl(Uri.parse(url));
request.headers.set('content-type', 'application/json');
request.add(utf8.encode(json.encode(map)));
var response = await request.close();
var bytes = await consolidateHttpClientResponseBytes(response);
await _image.writeAsBytes(bytes);
userImage(_image);
}
catch (value){
print(value);
}
}
当我尝试读取响应时,出现此错误: HttpException:内容大小超出指定的contentLength。写入72个字节,而预期为0。
我已经尝试了无休止的Google搜索,以了解如何使用流从服务器下载文件,但是找不到任何东西。我需要的是类似于bitmap class in .NET的东西,可以将其放入流中并将其转换为图像。
有人可以帮助我吗?这将不胜感激。
答案 0 :(得分:2)
我可以使用以下代码成功完成此操作:
void getImage(String url, String userId, sessionToken) async{
var uri = Uri.parse(url);
Map body = {'Session': sessionToken, 'UserId': userId};
try {
final response = await http.post(uri,
headers: {"Content-Type": "application/json"},
body: utf8.encode(json.encode(body)));
if (response.contentLength == 0){
return;
}
Directory tempDir = await getTemporaryDirectory();
String tempPath = tempDir.path;
File file = new File('$tempPath/$userId.png');
await file.writeAsBytes(response.bodyBytes);
displayImage(file);
}
catch (value) {
print(value);
}
}
感谢您的帮助:)
答案 1 :(得分:0)
这是一个相关示例,仅显示如何流式传输网页或文件的内容:
import 'package:http/http.dart' as http;
Future<void> main() async {
final url = Uri.parse('https://google.com/');
final client = http.Client();
final request = http.Request('GET', url);
final response = await client.send(request);
final stream = response.stream;
await for (var data in stream) {
print(data.length);
}
client.close();
}
这是一个完整的示例,因此,如果将http包添加到pubspec.yaml文件中,则可以复制整个内容以对其进行测试。该示例显示每个传入数据块的大小。如果要将这些字节转换为字符串,可以使用stream.transform(utf8.decoder)
。
我正在使用上面的示例来学习流媒体的工作原理。一个更完整的解决方案将需要处理错误并保存文件。
感谢this answer对此的帮助。