decide when to show embedded text based on mime type of file

This commit is contained in:
neri 2021-03-10 00:02:02 +01:00
parent 1d51c200d6
commit 2388e2c2ce
2 changed files with 18 additions and 13 deletions

View File

@ -153,7 +153,7 @@ async fn download(
config: web::Data<Config>, config: web::Data<Config>,
) -> Result<HttpResponse, Error> { ) -> Result<HttpResponse, Error> {
let id = req.match_info().query("id"); let id = req.match_info().query("id");
let mut rows = sqlx::query("SELECT file_id, file_name, kind from files WHERE file_id = $1") let mut rows = sqlx::query("SELECT file_id, file_name from files WHERE file_id = $1")
.bind(id) .bind(id)
.fetch(db.as_ref()); .fetch(db.as_ref());
let row: PgRow = rows let row: PgRow = rows
@ -164,11 +164,12 @@ async fn download(
let file_id: String = row.get("file_id"); let file_id: String = row.get("file_id");
let file_name: String = row.get("file_name"); let file_name: String = row.get("file_name");
let kind: String = row.get("kind");
let mut path = config.files_dir.clone(); let mut path = config.files_dir.clone();
path.push(&file_id); path.push(&file_id);
if kind == FileKind::TEXT.to_string() && !req.query_string().contains("raw") { let download = req.query_string().contains("dl");
let (content_type, mut content_disposition) = get_content_types(&path, &file_name);
if content_type.type_() == mime::TEXT && !download {
let content = fs::read_to_string(path).await.map_err(|_| { let content = fs::read_to_string(path).await.map_err(|_| {
error::ErrorInternalServerError("this file should be here but could not be found") error::ErrorInternalServerError("this file should be here but could not be found")
})?; })?;
@ -177,7 +178,9 @@ async fn download(
let response = HttpResponse::Ok().content_type("text/html").body(view_html); let response = HttpResponse::Ok().content_type("text/html").body(view_html);
Ok(response) Ok(response)
} else { } else {
let (content_type, content_disposition) = get_content_types(&path, &file_name); if download {
content_disposition.disposition = DispositionType::Attachment;
}
let file = NamedFile::open(path) let file = NamedFile::open(path)
.map_err(|_| { .map_err(|_| {
error::ErrorInternalServerError("this file should be here but could not be found") error::ErrorInternalServerError("this file should be here but could not be found")
@ -200,8 +203,16 @@ fn get_content_types(path: &Path, filename: &str) -> (Mime, ContentDisposition)
_ => DispositionType::Attachment, _ => DispositionType::Attachment,
}; };
let mut parameters = vec![DispositionParam::Filename(filename.to_owned())]; let cd = ContentDisposition {
disposition,
parameters: get_disposition_params(filename),
};
(ct, cd)
}
fn get_disposition_params(filename: &str) -> Vec<DispositionParam> {
let mut parameters = vec![DispositionParam::Filename(filename.to_owned())];
if !filename.is_ascii() { if !filename.is_ascii() {
parameters.push(DispositionParam::FilenameExt(ExtendedValue { parameters.push(DispositionParam::FilenameExt(ExtendedValue {
charset: Charset::Ext(String::from("UTF-8")), charset: Charset::Ext(String::from("UTF-8")),
@ -209,13 +220,7 @@ fn get_content_types(path: &Path, filename: &str) -> (Mime, ContentDisposition)
value: filename.to_owned().into_bytes(), value: filename.to_owned().into_bytes(),
})) }))
} }
parameters
let cd = ContentDisposition {
disposition,
parameters,
};
(ct, cd)
} }
async fn not_found() -> Result<HttpResponse, Error> { async fn not_found() -> Result<HttpResponse, Error> {

View File

@ -13,7 +13,7 @@
{text}</textarea {text}</textarea
> >
<br /> <br />
<a class="main button" href="?raw">herunterladen</a> <a class="main button" href="?dl">herunterladen</a>
<button id="copy" class="button">text kopieren</button> <button id="copy" class="button">text kopieren</button>
</main> </main>
<script src="/static/copy.js" lang="javascript"></script> <script src="/static/copy.js" lang="javascript"></script>