pub struct WriteOptions {
pub append: bool,
pub cache_control: Option<String>,
pub content_type: Option<String>,
pub content_disposition: Option<String>,
pub content_encoding: Option<String>,
pub user_metadata: Option<HashMap<String, String>>,
pub if_match: Option<String>,
pub if_none_match: Option<String>,
pub if_not_exists: bool,
pub concurrent: usize,
pub chunk: Option<usize>,
}
Expand description
Options for write operations.
Fields§
§append: bool
Sets append mode for this operation.
§Capability
Check [Capability::write_can_append
] before using this option.
§Behavior
- By default, write operations overwrite existing files
- When append is set to true:
- New data will be appended to the end of existing file
- If file doesn’t exist, it will be created
- If not supported, will return an error
This operation allows adding data to existing files instead of overwriting them.
cache_control: Option<String>
Sets Cache-Control header for this write operation.
§Capability
Check [Capability::write_with_cache_control
] before using this feature.
§Behavior
- If supported, sets Cache-Control as system metadata on the target file
- The value should follow HTTP Cache-Control header format
- If not supported, the value will be ignored
This operation allows controlling caching behavior for the written content.
§Use Cases
- Setting browser cache duration
- Configuring CDN behavior
- Optimizing content delivery
- Managing cache invalidation
§References
content_type: Option<String>
Sets Content-Type
header for this write operation.
§Capability
Check [Capability::write_with_content_type
] before using this feature.
§Behavior
- If supported, sets Content-Type as system metadata on the target file
- The value should follow MIME type format (e.g. “text/plain”, “image/jpeg”)
- If not supported, the value will be ignored
This operation allows specifying the media type of the content being written.
content_disposition: Option<String>
Sets Content-Disposition header for this write request.
§Capability
Check [Capability::write_with_content_disposition
] before using this feature.
§Behavior
- If supported, sets Content-Disposition as system metadata on the target file
- The value should follow HTTP Content-Disposition header format
- Common values include:
inline
- Content displayed within browserattachment
- Content downloaded as fileattachment; filename="example.jpg"
- Downloaded with specified filename
- If not supported, the value will be ignored
This operation allows controlling how the content should be displayed or downloaded.
content_encoding: Option<String>
Sets Content-Encoding header for this write request.
§Capability
Check [Capability::write_with_content_encoding
] before using this feature.
§Behavior
- If supported, sets Content-Encoding as system metadata on the target file
- The value should follow HTTP Content-Encoding header format
- Common values include:
gzip
- Content encoded using gzip compressiondeflate
- Content encoded using deflate compressionbr
- Content encoded using Brotli compressionidentity
- No encoding applied (default value)
- If not supported, the value will be ignored
This operation allows specifying the encoding applied to the content being written.
user_metadata: Option<HashMap<String, String>>
Sets user metadata for this write request.
§Capability
Check [Capability::write_with_user_metadata
] before using this feature.
§Behavior
- If supported, the user metadata will be attached to the object during write
- Accepts key-value pairs where both key and value are strings
- Keys are case-insensitive in most services
- Services may have limitations for user metadata, for example:
- Key length is typically limited (e.g., 1024 bytes)
- Value length is typically limited (e.g., 4096 bytes)
- Total metadata size might be limited
- Some characters might be forbidden in keys
- If not supported, the metadata will be ignored
User metadata provides a way to attach custom metadata to objects during write operations. This metadata can be retrieved later when reading the object.
if_match: Option<String>
Sets If-Match header for this write request.
§Capability
Check [Capability::write_with_if_match
] before using this feature.
§Behavior
- If supported, the write operation will only succeed if the target’s ETag matches the specified value
- The value should be a valid ETag string
- Common values include:
- A specific ETag value like
"686897696a7c876b7e"
*
- Matches any existing resource
- A specific ETag value like
- If not supported, the value will be ignored
This operation provides conditional write functionality based on ETag matching, helping prevent unintended overwrites in concurrent scenarios.
if_none_match: Option<String>
Sets If-None-Match header for this write request.
Note: Certain services, like s3
, support if_not_exists
but not if_none_match
.
Use if_not_exists
if you only want to check whether a file exists.
§Capability
Check [Capability::write_with_if_none_match
] before using this feature.
§Behavior
- If supported, the write operation will only succeed if the target’s ETag does not match the specified value
- The value should be a valid ETag string
- Common values include:
- A specific ETag value like
"686897696a7c876b7e"
*
- Matches if the resource does not exist
- A specific ETag value like
- If not supported, the value will be ignored
This operation provides conditional write functionality based on ETag non-matching, useful for preventing overwriting existing resources or ensuring unique writes.
if_not_exists: bool
Sets the condition that write operation will succeed only if target does not exist.
§Capability
Check [Capability::write_with_if_not_exists
] before using this feature.
§Behavior
- If supported, the write operation will only succeed if the target path does not exist
- Will return error if target already exists
- If not supported, the value will be ignored
This operation provides a way to ensure write operations only create new resources without overwriting existing ones, useful for implementing “create if not exists” logic.
concurrent: usize
Sets concurrent write operations for this writer.
§Behavior
- By default, OpenDAL writes files sequentially
- When concurrent is set:
- Multiple write operations can execute in parallel
- Write operations return immediately without waiting if tasks space are available
- Close operation ensures all writes complete in order
- Memory usage increases with concurrency level
- If not supported, falls back to sequential writes
This feature significantly improves performance when:
- Writing large files
- Network latency is high
- Storage service supports concurrent uploads like multipart uploads
§Performance Impact
Setting appropriate concurrency can:
- Increase write throughput
- Reduce total write time
- Better utilize available bandwidth
- Trade memory for performance
chunk: Option<usize>
Sets chunk size for buffered writes.
§Capability
Check [Capability::write_multi_min_size
] and [Capability::write_multi_max_size
] for size limits.
§Behavior
- By default, OpenDAL sets optimal chunk size based on service capabilities
- When chunk size is set:
- Data will be buffered until reaching chunk size
- One API call will be made per chunk
- Last chunk may be smaller than chunk size
- Important considerations:
- Some services require minimum chunk sizes (e.g. S3’s EntityTooSmall error)
- Smaller chunks increase API calls and costs
- Larger chunks increase memory usage, but improve performance and reduce costs
§Performance Impact
Setting appropriate chunk size can:
- Reduce number of API calls
- Improve overall throughput
- Lower operation costs
- Better utilize network bandwidth
Trait Implementations§
Source§impl Clone for WriteOptions
impl Clone for WriteOptions
Source§fn clone(&self) -> WriteOptions
fn clone(&self) -> WriteOptions
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source
. Read moreSource§impl Debug for WriteOptions
impl Debug for WriteOptions
Source§impl Default for WriteOptions
impl Default for WriteOptions
Source§fn default() -> WriteOptions
fn default() -> WriteOptions
Source§impl From<WriteOptions> for (OpWrite, OpWriter)
impl From<WriteOptions> for (OpWrite, OpWriter)
Source§fn from(value: WriteOptions) -> Self
fn from(value: WriteOptions) -> Self
Source§impl PartialEq for WriteOptions
impl PartialEq for WriteOptions
impl Eq for WriteOptions
impl StructuralPartialEq for WriteOptions
Auto Trait Implementations§
impl Freeze for WriteOptions
impl RefUnwindSafe for WriteOptions
impl Send for WriteOptions
impl Sync for WriteOptions
impl Unpin for WriteOptions
impl UnwindSafe for WriteOptions
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
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
§impl<T> CompatExt for T
impl<T> CompatExt for T
§impl<T> Conv for T
impl<T> Conv for T
§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.Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key
and return true
if they are equal.§impl<T> FmtForward for T
impl<T> FmtForward for T
§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
self
to use its Binary
implementation when Debug
-formatted.§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
self
to use its Display
implementation when
Debug
-formatted.§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
self
to use its LowerExp
implementation when
Debug
-formatted.§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
self
to use its LowerHex
implementation when
Debug
-formatted.§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
self
to use its Octal
implementation when Debug
-formatted.§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
self
to use its Pointer
implementation when
Debug
-formatted.§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
self
to use its UpperExp
implementation when
Debug
-formatted.§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
self
to use its UpperHex
implementation when
Debug
-formatted.§fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
§impl<T> FutureExt for T
impl<T> FutureExt for T
§fn with_context(self, otel_cx: Context) -> WithContext<Self>
fn with_context(self, otel_cx: Context) -> WithContext<Self>
§fn with_current_context(self) -> WithContext<Self>
fn with_current_context(self) -> WithContext<Self>
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left
is true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left(&self)
returns true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> IntoRequest<T> for T
impl<T> IntoRequest<T> for T
Source§fn into_request(self) -> Request<T>
fn into_request(self) -> Request<T>
T
in a tonic::Request
Source§impl<T> IntoRequest<T> for T
impl<T> IntoRequest<T> for T
Source§fn into_request(self) -> Request<T>
fn into_request(self) -> Request<T>
T
in a tonic::Request
§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
self
and passes that borrow into the pipe function. Read more§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
self
and passes that borrow into the pipe function. Read more§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
self
, then passes self.as_ref()
into the pipe function.§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
self
, then passes self.as_mut()
into the pipe
function.§fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self
, then passes self.deref()
into the pipe function.§impl<T> Pointable for T
impl<T> Pointable for T
§impl<T> Tap for T
impl<T> Tap for T
§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B>
of a value. Read more§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B>
of a value. Read more§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R>
view of a value. Read more§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R>
view of a value. Read more§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target
of a value. Read more§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target
of a value. Read more§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap()
only in debug builds, and is erased in release builds.§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut()
only in debug builds, and is erased in release
builds.§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.tap_borrow()
only in debug builds, and is erased in release
builds.§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.tap_borrow_mut()
only in debug builds, and is erased in release
builds.§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.tap_ref()
only in debug builds, and is erased in release
builds.§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.tap_ref_mut()
only in debug builds, and is erased in release
builds.§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref()
only in debug builds, and is erased in release
builds.