pub struct DirectUpload {
pub signed_key: String,
pub url: String,
pub headers: BTreeMap<String, String>,
}Expand description
A direct upload the browser may perform: PUT the file to url with headers, then submit signed_key.
Returned by direct_upload and sent to
the browser as JSON (Rails’ direct_upload: { url, headers } plus
signed_id). signed_key is the new object key followed by an HMAC:
attach_direct_upload accepts
only keys this app issued, so a client cannot claim another record’s file.
§Examples
use ocre::storage::{DirectUpload, DirectUploadRequest, Rules, S3Endpoint};
const PHOTO: Rules = Rules { max_bytes: 1024, content_types: &["image/png"] };
let r2 = S3Endpoint::r2("acc", "blog-storage", "AKID", "secret");
let request = DirectUploadRequest { filename: "a.png".into(), content_type: "image/png".into(), size: 10 };
let upload = DirectUpload::sign(&r2, "uploads/photos", "image", &request, &PHOTO, 1_790_000_000, 600).unwrap();
assert!(upload.signed_key.starts_with("uploads/photos/"));
assert_eq!(upload.headers["Content-Type"], "image/png");
let json = serde_json::to_value(&upload).unwrap();
assert!(json["url"].as_str().unwrap().contains("X-Amz-SignedHeaders=content-length%3Bcontent-type%3Bhost"));Fields§
§signed_key: StringThe object key and its signature (<prefix>/<22 characters>.<43 characters>); the form submits it.
url: StringPresigned PUT URL on R2’s S3 API.
headers: BTreeMap<String, String>Headers the PUT must carry, exactly (Content-Type); the browser adds Content-Length itself.
Implementations§
Source§impl DirectUpload
impl DirectUpload
Sourcepub fn sign(
endpoint: &S3Endpoint,
prefix: &str,
field: &str,
request: &DirectUploadRequest,
rules: &Rules,
now: i64,
expires_in: u64,
) -> Result<Self>
pub fn sign( endpoint: &S3Endpoint, prefix: &str, field: &str, request: &DirectUploadRequest, rules: &Rules, now: i64, expires_in: u64, ) -> Result<Self>
Checks request against rules and presigns a PUT of a new key under prefix, valid expires_in seconds.
The URL signs Content-Type (the declared type, normalized) and
Content-Length (the declared size), so R2 refuses a PUT of
another type or size. direct_upload
calls it with the R2_* settings and ocre::now().
§Errors
Error::Invalid (422) on field when the declared size or type
breaks rules (the messages of Validator::file);
Error::Internal when expires_in is out of range.
§Examples
use ocre::storage::{DirectUpload, DirectUploadRequest, Rules, S3Endpoint};
const PHOTO: Rules = Rules { max_bytes: 1024, content_types: &["image/png"] };
let r2 = S3Endpoint::r2("acc", "blog-storage", "AKID", "secret");
let svg = DirectUploadRequest { filename: "a.svg".into(), content_type: "image/svg+xml".into(), size: 10 };
let err = DirectUpload::sign(&r2, "uploads", "image", &svg, &PHOTO, 1_790_000_000, 600).unwrap_err();
assert_eq!(err.to_string(), "invalid: Image has an unsupported type (allowed: image/png)");Trait Implementations§
Source§impl Clone for DirectUpload
impl Clone for DirectUpload
Source§fn clone(&self) -> DirectUpload
fn clone(&self) -> DirectUpload
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for DirectUpload
impl Debug for DirectUpload
Source§impl<'de> Deserialize<'de> for DirectUpload
impl<'de> Deserialize<'de> for DirectUpload
Source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
impl Eq for DirectUpload
Source§impl PartialEq for DirectUpload
impl PartialEq for DirectUpload
Source§fn eq(&self, other: &DirectUpload) -> bool
fn eq(&self, other: &DirectUpload) -> bool
self and other values to be equal, and is used by ==.Source§impl Serialize for DirectUpload
impl Serialize for DirectUpload
impl StructuralPartialEq for DirectUpload
Auto Trait Implementations§
impl Freeze for DirectUpload
impl RefUnwindSafe for DirectUpload
impl Send for DirectUpload
impl Sync for DirectUpload
impl Unpin for DirectUpload
impl UnsafeUnpin for DirectUpload
impl UnwindSafe for DirectUpload
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> DeserializeOwned for Twhere
T: for<'de> Deserialize<'de>,
§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key and return true if they are equal.