Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust:如何对大型文件执行HTTP PUT?_Rust - Fatal编程技术网

Rust:如何对大型文件执行HTTP PUT?

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

在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://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_learner
ureq
文档实际上有一个。如果您使用的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(())
}