在web-actix框架上实现上传文件

在web-actix框架上实现上传文件

注意,文件会因为报文大小限制的问题而不得不把文件分为以大小最大为16384( 2 14 2^{14} 214)B大小为单位的报文,所以应先创建文件,再逐一添加数据。

// use...
 
const SAVE_DIR:&str = "/root";

//...

fn save_file_create(
    name:String
){
    let filepath = std::path::Path::new(SAVE_DIR).join(name);
    std::fs::File::create(&filepath);
}

fn save_file_add(
    name:String,
    file:web::Bytes
)->Result<(), std::io::Error>{
    let filepath = std::path::Path::new(SAVE_DIR).join(name);
    let mut f = std::fs::OpenOptions::new().append(true).open(&filepath).unwrap();
    f.write_all(&file)
}

#[post("/upload/{name}")]
async fn upload_file(
    name: actix_web::web::Path<String>,
    mut payload: actix_multipart::Multipart
) -> Result<actix_web::HttpResponse, Error> {
    save_file_create(name.to_string());
    // iterate over multipart stream
    while let Some(item) = payload.next().await {
        let mut field = item?;
        // Field in turn is stream of *Bytes* object
        while let Some(chunk) = field.next().await {
            let data = chunk.unwrap();
            save_file_add(name.to_string(),data).unwrap();
        }
    }
    Ok(actix_web::HttpResponse::Ok().into())
}

// ...

其对应的js内容也比较简单

// ...
// <input type="file" id="upload_file" multiple/>
    var files = document.getElementById("upload_file").files;
    for(var i = 0 ;i<files.length;i++){ 
        var formData = new FormData();
        formData.append(files[i])
        fetch(url, {
            method: 'POST',
            body:formData
        })
    } 
// ...
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值