#juniper #rocket #upload #form-data #multipart-form #multipart #rocket-web

juniper_rocket_multipart_handler

Juniper Rocket Multipart 处理器

1 个不稳定版本

0.1.0 2022 年 5 月 25 日

#1182文件系统

CC0 许可证

23KB
347

Juniper Rocket Multipart

当前 crate 提供了一个处理器,允许在 Rocket 网络服务器上使用 Juniper 处理 multipart/data-form 请求。

它复现了 Juniper 对于 content-type 响应头为 application/jsonapplication/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