1 个不稳定版本
0.1.0 | 2022 年 5 月 25 日 |
---|
#1182 在 文件系统
23KB
347 行
Juniper Rocket Multipart
当前 crate 提供了一个处理器,允许在 Rocket 网络服务器上使用 Juniper 处理 multipart/data-form
请求。
它复现了 Juniper 对于 content-type
响应头为 application/json
和 application/graphql
的默认行为。
免责声明
当前 crate 仍在开发中,因为它还缺少以下内容:
- 单元测试
- 重建提供的映射对象
- 每个文件读取的最大字节数仍然是硬编码的
尽管如此,它应该是可用的。使用时请自行承担风险。
如何使用
你可以像加载 GraphQLRequest 一样加载 GraphQLUploadWrapper
,因为它们都是数据守卫。主要区别在于,你将通过包装器的 operations
属性调用查询的执行。
下面是一个基本示例
#[rocket::post("/upload", data = "<request>")]
pub async fn upload<'r>(
request: GraphQLUploadWrapper,
schema: &State<Schema>,
) -> GraphQLResponse {
request.operations.execute(&*schema, &Context).await
}
获取上传的文件
为了获取上传的文件,你需要实现自己的上下文对象,该对象将缓冲文件传递给你的执行方法。
示例
struct Ctx{
files: Option<HashMap<String, TempFile>>
};
impl juniper::Context for Ctx {}
然后你可以像这样将缓冲文件注入到你的操作中
struct Ctx{ files: Option<HashMap<String, TempFile>> };
impl juniper::Context for Ctx {}
#[rocket::post("/upload", data = "<request>")]
pub async fn upload<'r>(
request: GraphQLUploadWrapper,
schema: &State<Schema>,
) -> GraphQLResponse {
request.operations.execute(&*schema, &Ctx{ files: request.files }).await
}
关于处理文件的说明
除了通过哈希表在堆内存中分配它们之外,包装器对上传的文件不做任何特殊处理,这意味着它们不会被存储在任何地方,甚至不是在临时文件夹中,除非你决定这样做。
有关上传文件的其他数据和信息的更多信息,请参阅 TempFile。
依赖项
~20–56MB
~1M SLoC