fix: remove unzip file even failed to unzip
This commit is contained in:
parent
c50f97925c
commit
07f4e7d0f2
1 changed files with 29 additions and 21 deletions
|
@ -260,27 +260,9 @@ impl InnerService {
|
|||
|
||||
let query = req.uri().query().unwrap_or_default();
|
||||
if query == "unzip" {
|
||||
let root = path.parent().unwrap();
|
||||
let mut zip = ZipFileReader::new(File::open(&path).await?).await?;
|
||||
for i in 0..zip.entries().len() {
|
||||
let entry = &zip.entries()[i];
|
||||
let entry_name = entry.name();
|
||||
let entry_path = root.join(entry_name);
|
||||
if entry_name.ends_with('/') {
|
||||
fs::create_dir_all(entry_path).await?;
|
||||
} else {
|
||||
if !self.args.allow_delete && fs::metadata(&entry_path).await.is_ok() {
|
||||
continue;
|
||||
}
|
||||
if let Some(parent) = entry_path.parent() {
|
||||
if fs::symlink_metadata(parent).await.is_err() {
|
||||
fs::create_dir_all(&parent).await?;
|
||||
}
|
||||
}
|
||||
let mut outfile = fs::File::create(&entry_path).await?;
|
||||
let mut reader = zip.entry_reader(i).await?;
|
||||
io::copy(&mut reader, &mut outfile).await?;
|
||||
}
|
||||
if let Err(e) = self.unzip_file(path).await {
|
||||
eprintln!("Failed to unzip {}, {}", path.display(), e);
|
||||
status!(res, StatusCode::BAD_REQUEST);
|
||||
}
|
||||
fs::remove_file(&path).await?;
|
||||
}
|
||||
|
@ -539,6 +521,32 @@ impl InnerService {
|
|||
.unwrap_or_default()
|
||||
}
|
||||
|
||||
async fn unzip_file(&self, path: &Path) -> BoxResult<()> {
|
||||
let root = path.parent().unwrap();
|
||||
let mut zip = ZipFileReader::new(File::open(&path).await?).await?;
|
||||
for i in 0..zip.entries().len() {
|
||||
let entry = &zip.entries()[i];
|
||||
let entry_name = entry.name();
|
||||
let entry_path = root.join(entry_name);
|
||||
if entry_name.ends_with('/') {
|
||||
fs::create_dir_all(entry_path).await?;
|
||||
} else {
|
||||
if !self.args.allow_delete && fs::metadata(&entry_path).await.is_ok() {
|
||||
continue;
|
||||
}
|
||||
if let Some(parent) = entry_path.parent() {
|
||||
if fs::symlink_metadata(parent).await.is_err() {
|
||||
fs::create_dir_all(&parent).await?;
|
||||
}
|
||||
}
|
||||
let mut outfile = fs::File::create(&entry_path).await?;
|
||||
let mut reader = zip.entry_reader(i).await?;
|
||||
io::copy(&mut reader, &mut outfile).await?;
|
||||
}
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn extract_path(&self, path: &str) -> Option<PathBuf> {
|
||||
let decoded_path = percent_decode(path[1..].as_bytes()).decode_utf8().ok()?;
|
||||
let slashes_switched = if cfg!(windows) {
|
||||
|
|
Loading…
Reference in a new issue