Skip to content

Commit 68078e8

Browse files
committed
添加文件下载
1 parent fdcbb91 commit 68078e8

File tree

7 files changed

+281
-55
lines changed

7 files changed

+281
-55
lines changed

Cargo.lock

Lines changed: 108 additions & 5 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dsweb-core/Cargo.toml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,3 +12,6 @@ scrap = "0.5"
1212
enigo = "0.1.2"
1313
flate2 = "1.0"
1414
clipboard = "0.5"
15+
tiny_http = "0.11"
16+
ascii = "1.0"
17+
percent-encoding = "2.3.0"

dsweb-core/src/http_server.rs

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
use std::{
2+
net::{Ipv4Addr, SocketAddrV4}, fs,
3+
};
4+
5+
use tiny_http::{Header, Response, Server};
6+
7+
fn get_files(dir: &str) -> Vec<String> {
8+
let mut res = Vec::<String>::new();
9+
let mt = fs::metadata(dir);
10+
if mt.is_err() {
11+
fs::create_dir(dir).unwrap();
12+
return res;
13+
}
14+
let folder = fs::read_dir(dir).unwrap();
15+
for file in folder {
16+
let f = file.unwrap();
17+
if f.file_type().unwrap().is_file() {
18+
res.push(f.path().file_name().unwrap().to_string_lossy().to_string());
19+
}
20+
}
21+
return res;
22+
}
23+
24+
pub fn run(port: u16) {
25+
let host = SocketAddrV4::new(Ipv4Addr::new(0, 0, 0, 0), port);
26+
let server = Server::http(host).unwrap();
27+
let file_dir = "files";
28+
for request in server.incoming_requests() {
29+
let _url = request.url();
30+
if _url.starts_with("/files") {
31+
// 文件列表
32+
let fls = get_files(file_dir);
33+
let res = fls.join("&");
34+
let mut response = Response::from_string(res);
35+
response.add_header(Header {
36+
field: "Access-Control-Allow-Origin".parse().unwrap(),
37+
value: ascii::AsciiString::from_ascii("*").unwrap(),
38+
});
39+
request.respond(response).unwrap();
40+
} else if _url.starts_with("/download") {
41+
// 下载文件
42+
let ps = _url.split("/");
43+
let _file = ps.last().unwrap();
44+
let _file = percent_encoding::percent_decode_str(_file).decode_utf8().unwrap();
45+
eprintln!("download {}", _file);
46+
let file = fs::File::open(&format!("{}/{}", file_dir, _file)).unwrap();
47+
let mut response = Response::from_file(file);
48+
response.add_header(Header {
49+
field: "Access-Control-Allow-Origin".parse().unwrap(),
50+
value: ascii::AsciiString::from_ascii("*").unwrap(),
51+
});
52+
response.add_header(Header {
53+
field: "Content-Type".parse().unwrap(),
54+
value: ascii::AsciiString::from_ascii("application/octet-stream").unwrap(),
55+
});
56+
request.respond(response).unwrap();
57+
} else if _url.starts_with("/upload") {
58+
if request.method().as_str() == "OPTIONS" {
59+
let mut response = Response::from_string("");
60+
response.add_header(Header {
61+
field: "Access-Control-Allow-Origin".parse().unwrap(),
62+
value: ascii::AsciiString::from_ascii("*").unwrap(),
63+
});
64+
request.respond(response).unwrap();
65+
continue;
66+
}
67+
// 文件上传
68+
// let mut fname = String::new();
69+
// for h in request.headers() {
70+
// eprintln!("{}", h.value);
71+
// if h.field.as_str() == "Content-Disposition" {
72+
// fname.push_str(h.value.as_str());
73+
// break;
74+
// }
75+
// }
76+
// eprintln!("{}", fname);
77+
// let filename = fname.split("filename=").nth(1).unwrap().trim_matches('"');
78+
// let mut file = File::create(format!("{}/{}", file_dir, filename)).unwrap();
79+
// let mut buffer = [0; 4096];
80+
// while let Some(size) = request.as_reader().read(&mut buffer).ok() {
81+
// if size == 0 {
82+
// break;
83+
// }
84+
// file.write_all(&buffer[..size]).unwrap();
85+
// }
86+
87+
let mut response = Response::from_string("File uploaded successfully!");
88+
response.add_header(Header {
89+
field: "Access-Control-Allow-Origin".parse().unwrap(),
90+
value: ascii::AsciiString::from_ascii("*").unwrap(),
91+
});
92+
request.respond(response).unwrap();
93+
}
94+
}
95+
}

dsweb-core/src/main.rs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,21 @@ mod screen;
33
mod server;
44
mod config;
55
mod imop;
6+
mod http_server;
67
fn main() {
78
let args: Vec<String> = std::env::args().collect();
89
// defalut port
910
let mut port = 41290;
11+
let mut http_port = 41291;
12+
if args.len() >= 2 {
13+
port = args[1].parse::<u16>().unwrap();
14+
}
1015
if args.len() >= 3 {
11-
port = args[2].parse::<u16>().unwrap();
16+
http_port = args[2].parse::<u16>().unwrap();
1217
}
13-
18+
std::thread::spawn(move ||{
19+
http_server::run(http_port);
20+
});
1421
// run forever
1522
server::run(port);
1623
}

dsweb-core/src/server.rs

Lines changed: 1 addition & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ use enigo::MouseControllable;
99
use flate2::write::DeflateEncoder;
1010
use flate2::Compression;
1111
use websocket::sync::Client;
12-
use std::fs;
1312
use std::io::Write;
1413
use std::net::Ipv4Addr;
1514
use std::net::SocketAddrV4;
@@ -54,7 +53,7 @@ pub fn run(port: u16) {
5453
});
5554
}
5655
"diffscreen-transfer" => {
57-
// 处理复制粘贴、文件
56+
// 处理复制粘贴
5857
let client = request.use_protocol("diffscreen-transfer").accept().unwrap();
5958
std::thread::spawn(move ||{
6059
handle_transfer(client);
@@ -199,23 +198,6 @@ fn screen_stream(mut stream: Writer<TcpStream>, running: Arc<AtomicBool>) {
199198
}
200199
}
201200

202-
fn get_files(dir: &str) -> Vec<String> {
203-
let mut res = Vec::<String>::new();
204-
let mt = fs::metadata(dir);
205-
if mt.is_err() {
206-
fs::create_dir(dir).unwrap();
207-
return res;
208-
}
209-
let folder = fs::read_dir(dir).unwrap();
210-
for file in folder {
211-
let f = file.unwrap();
212-
if f.file_type().unwrap().is_file() {
213-
res.push(f.path().file_name().unwrap().to_string_lossy().to_string());
214-
}
215-
}
216-
return res;
217-
}
218-
219201
fn handle_transfer(client: Client<TcpStream>) {
220202
let (mut receiver, mut sender) = client.split().unwrap();
221203
let mut cbctx: ClipboardContext = ClipboardProvider::new().unwrap();
@@ -237,11 +219,6 @@ fn handle_transfer(client: Client<TcpStream>) {
237219
txt.insert_str(0, "copy-text ");
238220
sender.send_message(&OwnedMessage::Text(txt)).unwrap();
239221
}
240-
} else if ctx.starts_with("file-list") {
241-
let fss = get_files("files");
242-
let mut res = fss.join("&");
243-
res.insert_str(0, "file-list ");
244-
sender.send_message(&OwnedMessage::Text(res)).unwrap();
245222
}
246223
}
247224
OwnedMessage::Ping(ping) => {

0 commit comments

Comments
 (0)