Rust:如何对大型文件执行HTTP PUT?
在rust中,我使用来执行HTTP请求。这里有一个工作负责人的请求:Rust:如何对大型文件执行HTTP PUT?,rust,Rust,在rust中,我使用来执行HTTP请求。这里有一个工作负责人的请求: let resp = ureq::head(&url).timeout_connect(5_000).call(); if !resp.ok() { return false; } 我看到ureq是动词PUT,pub-fn-PUT(path:&str)->Request只是不确定如何使用它。如何传递文件/filehandle/fullpath 下面是我在bash中如何做到这一点: $ curl -v http
let resp = ureq::head(&url).timeout_connect(5_000).call();
if !resp.ok() {
return false;
}
我看到ureq是动词PUT,pub-fn-PUT(path:&str)->Request
只是不确定如何使用它。如何传递文件/filehandle/fullpath
下面是我在bash中如何做到这一点:
$ curl -v http://192.168.1.100:9193/ -T deleteme.mp4
* Expire in 0 ms for 6 (transfer 0x1102880)
* Trying 192.168.1.100...
* TCP_NODELAY set
* Expire in 200 ms for 4 (transfer 0x1102880)
* Connected to 192.168.1.100 (192.168.1.100) port 9193 (#0)
> PUT /deleteme.mp4 HTTP/1.1
> Host: 192.168.1.100:9193
> User-Agent: curl/7.64.0
> Accept: */*
> Content-Length: 779189
> Expect: 100-continue
>
* Expire in 1000 ms for 0 (transfer 0x1102880)
< HTTP/1.1 100 Continue
* We are completely uploaded and fine
< HTTP/1.1 200 OK
< Date: Fri, 03 Jan 2020 23:57:41 GMT
< Content-Length: 0
<
* Connection #0 to host 192.168.1.100 left intact
$ curl -I http://192.168.1.100:9193/deleteme.mp4
HTTP/1.1 200 OK
Content-Length: 779189
Date: Fri, 03 Jan 2020 23:57:44 GMT
如何使管道在
BufReader
和ureq
之间工作?将文件读入内存后,您可以使用返回的请求上的函数
以这些字节作为正文发送请求
您可以学习如何读取文件。对于非空正文的HTTP请求,您必须设置
内容长度
或传输编码
头。例如,在curl会话中有一个内容长度
标题
将为您设置此标题,但不会。你必须自己做:
use std::error::Error;
use std::fs::File;
use std::io::BufReader;
fn main() -> Result<(), Box<dyn Error>> {
let f = File::open("/tmp/deleteme.mp4")?;
let metadata = f.metadata()?;
let buffered_reader = BufReader::new(f);
let r = ureq::put("http://192.168.1.100:9193/deleteme.mp4")
.set("Content-Length", &metadata.len().to_string())
.send(buffered_reader);
println!("{:?}", r);
Ok(())
}
使用std::error::error;
使用std::fs::File;
使用std::io::BufReader;
fn main()->结果{
设f=File::open(“/tmp/deleteme.mp4”)?;
让metadata=f.metadata()?;
让缓冲读取器=BufReader::new(f);
设r=ureq::put(“http://192.168.1.100:9193/deleteme.mp4")
.set(“内容长度”和元数据.len().to_string())
.send(缓冲读卡器);
println!(“{:?}”,r);
好(())
}
请参见问题中的编辑1。请点击!您是否可以演示如何使用传输编码
标题执行此操作?@bugging_learnerureq
文档实际上有一个。如果您使用的HTTP服务器可以处理分块编码,那么它应该可以正常工作。
use std::error::Error;
use std::fs::File;
use std::io::BufReader;
fn main() -> Result<(), Box<dyn Error>> {
let f = File::open("/tmp/deleteme.mp4")?;
let metadata = f.metadata()?;
let buffered_reader = BufReader::new(f);
let r = ureq::put("http://192.168.1.100:9193/deleteme.mp4")
.set("Content-Length", &metadata.len().to_string())
.send(buffered_reader);
println!("{:?}", r);
Ok(())
}