const std = @import("std");
const thread = std.Thread;
const http = std.http;
// URL
const download_url = "https://profile-avatar.csdnimg.cn/822d8bcff40c406b8d158657c9d68e3e_qq_35151259.jpg";
// 存放位置
const storage_pos = "./image.png";
// 写文件
// @param filename: 文件路径
// @param buffer: 需要写入的字节切片
pub fn writeFile(filename: []const u8, buffer: []const u8) !void {
const file = try std.fs.cwd().createFile(filename, .{ .read = true });
defer file.close();
_ = try file.write(buffer);
}
pub fn main() !void {
// 初始化分配器
var gpa = std.heap.GeneralPurposeAllocator(.{}){};
defer _ = gpa.deinit();
const allocator = gpa.allocator();
// 把分配器传入到client中
var client: http.Client = .{ .allocator = allocator };
defer client.deinit();
// 解析你想要下载的文件URL
const uri = try std.Uri.parse(download_url);
// fetch默认不会存储任何response返回的内容(ignore),需要更改它的存储模式 `response_storage` 为dynamic或者static
// dynamic和static都需要你自行创建一个列表,fetch后会把结果放到这个列表里面
// dynamic:传递内部自行维护allocator的列表:ArrayListAligned(不需要提前分配,会自动扩展)
// static:传递不会自行维护allocator的列表:ArrayListAlignedUnmanaged(要提前分配好空间)
var list = std.ArrayList(u8).init(allocator);
const result = try client.fetch(.{ .location = .{ .uri = uri }, .response_storage = .{ .dynamic = &list } });
std.debug.print("result = {s}\n", .{if (result.status.phrase()) |r| r else ""});
if (result.status == .ok) {
const buffer = try list.toOwnedSlice();
defer allocator.free(buffer);
try writeFile(storage_pos, buffer);
}
// deinit一下,toOwnedSlice后再加deinit是没有问题的
list.deinit();
}
【ZIG】使用标准库下载一张图片
于 2024-05-12 15:34:17 首次发布