【问题标题】:How can I proxy/forward data using the Rocket web framework?如何使用 Rocket Web 框架代理/转发数据?
【发布时间】:2021-09-18 19:47:29
【问题描述】:

我有一个链接列表,我想从中随机提供数据,就好像用户自己手动访问了网址一样。这些不是所有相同的内容/文件类型,但是它们都是图像(jpeg 和 png)(理想情况下,我想对任何文件类型执行此操作,而不仅仅是 jpeg 和 png 或只是图像)。我知道我可以像这样直接将它们作为八位字节流提供,但这将导致文件被下载,而不是内联显示。我考虑过根据链接扩展名更改内容类型,但我找不到任何关于如何使用编译时未知的内容类型的信息。我也觉得可能有比这更好的方法。 How to forward data from a reqwest::blocking::Body in a Rocket responder? 似乎与我的问题有些相似,但文件类型始终为 png。我正在使用火箭的v0.5-rc

#[get("/rand_img")]
async fn get_img() -> Vec<u8> {
    let vs = vec![
        "https://www.publicdomainpictures.net/pictures/320000/velka/background-image.png",
        "https://www.publicdomainpictures.net/pictures/410000/velka/cobalt-city-1.png",
        "https://www.publicdomainpictures.net/pictures/60000/velka/went-boating.jpg",
        "https://www.publicdomainpictures.net/pictures/30000/velka/paulino-nacht.jpg"
    ];
    let choice = vs.choose(&mut rand::thread_rng()).unwrap();
    let response = reqwest::get(*choice).await.unwrap().bytes().await.unwrap();
    response.to_vec()
}

【问题讨论】:

  • 您不只是发送 302 是否有更深层次的原因?
  • @user2722968 不是真的,这不是什么重要的事情,我只是想看看是否可以这样做,我在其他任何地方都找不到任何有关此的信息。

标签: rust rust-rocket


【解决方案1】:

我最终下载了图像数据,将其存储在内存中,然后返回内容类型和图像数据。

    let imager = reqwest::get(&link)
        .await
        .expect("unable to fetch image")
        .bytes()
        .await
        .unwrap();
    let ext = &link.chars().rev().collect::<String>()[0..3] // this is really bad, i should split by `.` instead
    .chars()
    .rev().collect::<String>();
    return (ContentType::from_extension(ext).unwrap(), imager.to_vec())

【讨论】:

    猜你喜欢
    • 2022-01-14
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 2012-12-23
    • 1970-01-01
    • 2015-03-13
    • 1970-01-01
    相关资源
    最近更新 更多