Skip to content

Commit fd36ab4

Browse files
committed
Implement multipart forms using rocket instead of external lib
1 parent 702cbc3 commit fd36ab4

File tree

2 files changed

+15
-37
lines changed

2 files changed

+15
-37
lines changed

Cargo.toml

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,8 @@ diesel_migrations = {version="2.2.0"}
1919
diesel = {version="2.2.11", default-features = false, features = ["chrono", "postgres"] }
2020
postgis_diesel = { version="3.0.1" }
2121
#postgis = "0.9.0"
22-
rocket = { version = "0.5.0", features = ["json", "secrets"], default-features = false } #"tls",
22+
rocket = { version = "0.5.1", features = ["json", "secrets"], default-features = false } #"tls",
2323
rocket_sync_db_pools = { version = "0.1.0", default-features = false, features = ["diesel_postgres_pool"] }
24-
rocket-multipart-form-data = "0.10.5"
2524

2625
serde = { default-features = false, version = "1.0" }
2726
rand = { default-features = false, version = "0.8" }

src/map/image.rs

Lines changed: 14 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,11 @@ use diesel::QueryDsl;
2020
use rocket::data::Limits;
2121
use rocket::form::Form;
2222
use rocket::fs::NamedFile;
23+
use rocket::fs::TempFile;
2324
use rocket::futures::TryFutureExt;
2425

2526
use rocket::serde::json::Json;
26-
use rocket::Data;
2727
use rocket::{http::ContentType, State};
28-
use rocket_multipart_form_data::*;
2928
use serde::Deserialize;
3029
use serde::Serialize;
3130

@@ -89,52 +88,32 @@ async fn save_image(
8988
Ok(())
9089
}
9190

91+
92+
#[derive(FromForm)]
93+
pub struct AddImageForm<'a> {
94+
refers_to_id: i64,
95+
image: TempFile<'a>,
96+
}
97+
9298
#[post("/image/add", data = "<data>")]
9399
pub(crate) async fn add_image(
94-
content_type: &ContentType,
95-
data: Data<'_>,
100+
data: Form<AddImageForm<'_>>,
96101
user: Result<User<Authenticated>, InsignoError>,
97102
connection: Db,
98103
config: &State<InsignoConfig>,
99-
limits: &Limits,
100104
) -> Result<(), InsignoError> {
101105
let user = user?;
102-
// parse multipart data
103-
let mut options = MultipartFormDataOptions::with_multipart_form_data_fields(vec![
104-
MultipartFormDataField::file("image")
105-
.size_limit(limits.get("data-form").unwrap().as_u64())
106-
.content_type_by_string(Some(mime::IMAGE_STAR))
107-
.map_err(|e| InsignoError::new(500).debug(e))?,
108-
MultipartFormDataField::text("refers_to_id"),
109-
]);
110-
options.max_data_bytes = limits.get("data-form").unwrap().as_u64();
111-
let multipart_form_data = MultipartFormData::parse(content_type, data, options)
112-
.await
113-
.map_err(|e| InsignoError::new(500).debug(e))?;
114106

115107
// cast data to normal values
116-
let photo_path = multipart_form_data
117-
.files
118-
.get("image")
119-
.ok_or(InsignoError::new(500).debug("image field not found"))? //str_to_debug("image field not found"))?
120-
.first()
121-
.ok_or(InsignoError::new(500).debug("err"))?; //str_to_debug("err"))?; //at drop it cleans the file
122-
123-
let id = multipart_form_data
124-
.texts
125-
.get("refers_to_id")
126-
.ok_or(InsignoError::new(500).debug("image field not found"))?[0]
127-
.text
128-
.parse::<i64>()
129-
.map_err(|e| InsignoError::new(500).debug(e))?;
130-
108+
let photo_path = data.image.path().ok_or_else(|| InsignoError::new(500).debug("Image did not have a path"))?;
109+
let marker_id = data.refers_to_id;
131110
let user_id = user.get_id();
132111

133112
// check if user own the marker
134113
connection
135114
.run(move |conn| {
136115
markers::table
137-
.filter(markers::id.eq(id))
116+
.filter(markers::id.eq(marker_id))
138117
.filter(markers::created_by.eq(user_id))
139118
.or_filter(markers::solved_by.eq(user_id))
140119
.get_result::<Marker>(conn)
@@ -144,7 +123,7 @@ pub(crate) async fn add_image(
144123

145124
//generate unique name and convert
146125
let new_pos = unique_path(Path::new(&config.media_folder), Path::new("jpg"));
147-
convert_image(&photo_path.path, &new_pos)?;
126+
convert_image(photo_path, &new_pos)?;
148127

149128
let name = new_pos
150129
.strip_prefix(&config.media_folder)
@@ -154,7 +133,7 @@ pub(crate) async fn add_image(
154133
.to_string();
155134

156135
// try to save it in database
157-
save_image(connection, name.clone(), id, &user)
136+
save_image(connection, name.clone(), marker_id, &user)
158137
.map_err(|x| {
159138
let _ = fs::remove_file(new_pos); //sync version
160139
x

0 commit comments

Comments
 (0)