implement downloads, lots of misc tweaks/fixes
This commit is contained in:
parent
18caa2baf1
commit
2ec295e606
7 changed files with 354 additions and 854 deletions
38
src/main.rs
38
src/main.rs
|
@ -1,4 +1,4 @@
|
|||
//mod download;
|
||||
mod download;
|
||||
mod file;
|
||||
mod upload;
|
||||
mod zip;
|
||||
|
@ -6,27 +6,27 @@ mod zip;
|
|||
use std::{
|
||||
collections::HashMap,
|
||||
path::PathBuf,
|
||||
sync::{mpsc::Sender, RwLock},
|
||||
task::Waker,
|
||||
fs::File,
|
||||
};
|
||||
|
||||
use actix::Addr;
|
||||
use actix_web::{
|
||||
get, middleware::Logger, web, App, HttpRequest, HttpResponse, HttpServer, Responder,
|
||||
get, middleware::Logger, web, App, HttpRequest, HttpServer, Responder, HttpResponse,
|
||||
};
|
||||
use actix_web_actors::ws;
|
||||
use time::OffsetDateTime;
|
||||
use tokio::sync::RwLock;
|
||||
|
||||
const APP_NAME: &'static str = "transbeam";
|
||||
|
||||
pub struct UploadedFile {
|
||||
name: String,
|
||||
size: usize,
|
||||
size: u64,
|
||||
modtime: OffsetDateTime,
|
||||
}
|
||||
|
||||
impl UploadedFile {
|
||||
fn new(name: &str, size: usize, modtime: OffsetDateTime) -> Self {
|
||||
fn new(name: &str, size: u64, modtime: OffsetDateTime) -> Self {
|
||||
Self {
|
||||
name: sanitise_file_name::sanitise(name),
|
||||
size,
|
||||
|
@ -35,9 +35,10 @@ impl UploadedFile {
|
|||
}
|
||||
}
|
||||
|
||||
#[derive(Clone)]
|
||||
pub struct DownloadableFile {
|
||||
name: String,
|
||||
size: usize,
|
||||
size: u64,
|
||||
modtime: OffsetDateTime,
|
||||
uploader: Option<Addr<upload::Uploader>>,
|
||||
}
|
||||
|
@ -48,8 +49,26 @@ fn storage_dir() -> PathBuf {
|
|||
PathBuf::from(std::env::var("STORAGE_DIR").unwrap_or_else(|_| String::from("storage")))
|
||||
}
|
||||
|
||||
#[get("/download/{file_code}")]
|
||||
async fn handle_download(req: HttpRequest, path: web::Path<String>, data: AppData) -> actix_web::Result<HttpResponse> {
|
||||
let file_code = path.into_inner();
|
||||
if !file_code.as_bytes().iter().all(|c| c.is_ascii_alphanumeric()) {
|
||||
return Ok(HttpResponse::NotFound().finish());
|
||||
}
|
||||
let data = data.read().await;
|
||||
let info = data.get(&file_code);
|
||||
if let Some(info) = info {
|
||||
Ok(download::DownloadingFile {
|
||||
file: File::open(storage_dir().join(file_code))?,
|
||||
info: info.clone(),
|
||||
}.into_response(&req))
|
||||
} else {
|
||||
Ok(HttpResponse::NotFound().finish())
|
||||
}
|
||||
}
|
||||
|
||||
#[get("/upload")]
|
||||
async fn upload_socket(req: HttpRequest, stream: web::Payload, data: AppData) -> impl Responder {
|
||||
async fn handle_upload(req: HttpRequest, stream: web::Payload, data: AppData) -> impl Responder {
|
||||
ws::start(upload::Uploader::new(data), &req, stream)
|
||||
}
|
||||
|
||||
|
@ -70,7 +89,8 @@ async fn main() -> std::io::Result<()> {
|
|||
App::new()
|
||||
.app_data(data.clone())
|
||||
.wrap(Logger::default())
|
||||
.service(upload_socket)
|
||||
.service(handle_upload)
|
||||
.service(handle_download)
|
||||
.service(actix_files::Files::new("/", static_dir.clone()).index_file("index.html"))
|
||||
})
|
||||
.bind(("127.0.0.1", port))?
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue