For hyper 1.x, is there any example to upload a file with PUT method in a streaming way? #3853
-
I am using hyper v1.6, try googling and coding a lot but just could not find how to do it. it's very hard use http_body_util::{BodyExt, Empty, StreamBody};
use hyper::{
Request,
body::{Body, Bytes, Frame},
};
use hyper_util::rt::TokioIo;
use tokio::net::TcpStream;
use tokio::{fs::File, io::BufReader};
use tokio_util::codec::{BytesCodec, FramedRead};
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
println!("Hello, world!");
let stream = TcpStream::connect("http://www.google.com").await.unwrap();
let io = TokioIo::new(stream);
let (mut sender, conn) = hyper::client::conn::http1::handshake(io).await?;
let url: hyper::Uri = "https://www.google.com".parse().unwrap();
// read a file as a stream and send it
let file = File::open("/path/to/your/file").await?;
// create a stream from the file
// Get file size for Content-Length header
let file_size = file.metadata().await?.len();
// Convert file into a stream of Bytes ???
let file_stream = FramedRead::new(file, BytesCodec::new());
// Wrap the stream into a Hyper Body
// let body = ???
let req = Request::builder()
.uri(&url)
.method("PUT")
.header(hyper::header::HOST, url.authority().unwrap().as_str())
.body(body)
.unwrap();
let x = sender.send_request(req).await.unwrap();
Ok(())
} If you know how to code this, please help, thank you! |
Beta Was this translation helpful? Give feedback.
Answered by
seanmonstar
Mar 5, 2025
Replies: 1 comment 1 reply
-
You could look at the very similar send_file server example, adapting it to be used with a client. Another alternative, if you don't specifically need to the control at hyper's level, is to just use reqwest. It makes this stuff easy for you. |
Beta Was this translation helpful? Give feedback.
1 reply
Answer selected by
zjhken
# for free
to join this conversation on GitHub.
Already have an account?
# to comment
You could look at the very similar send_file server example, adapting it to be used with a client.
Another alternative, if you don't specifically need to the control at hyper's level, is to just use reqwest. It makes this stuff easy for you.