Struct WriteOptions
pub struct WriteOptions {Show 14 fields
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_version_match: Option<String>,
pub if_version_not_match: Option<String>,
pub if_not_exists: bool,
pub if_not_changed: Option<Metadata>,
pub concurrent: usize,
pub chunk: Option<usize>,
}Expand description
Options for write operations.
Each condition checks the file currently stored at the write path, and the service evaluates it atomically with the write’s visible commit:
- A false condition fails the write with
crate::ErrorKind::ConditionNotMatchand leaves the previously visible file unchanged. Depending on the service, the error may surface when the write starts, while writing, or when closing the writer. - A condition the service does not advertise through its capability fails
the write with
crate::ErrorKind::Unsupported; OpenDAL never silently drops a condition. A service that cannot preserve a combination of conditions also returnsUnsupported. - A service-side conflict unrelated to these conditions surfaces as
crate::ErrorKind::Conflict.
See the conditional operation specification for the complete cross-operation contract.
Fields§
§append: boolSets append mode for this operation.
§Capability
Check crate::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 crate::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 crate::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 crate::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 crate::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 crate::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>Write only when the file at the write path has this exact ETag.
The condition succeeds when the file exists and its ETag equals this
value. A file with a different ETag, or a missing file, fails the
write with crate::ErrorKind::ConditionNotMatch. Only concrete
ETag values are portable; a wildcard such as "*" has no portable
meaning here.
The operation returns crate::ErrorKind::Unsupported when the
service does not advertise crate::Capability::write_with_if_match.
if_none_match: Option<String>Write only when the file at the write path does not have this ETag.
With a concrete ETag value, the condition succeeds when the file has
a different ETag or does not exist; the write then replaces or
creates the file. A file whose ETag equals this value fails the write
with crate::ErrorKind::ConditionNotMatch. Only concrete ETag
values are portable; a wildcard such as "*" has no portable meaning
here.
The operation returns crate::ErrorKind::Unsupported when the
service does not advertise
crate::Capability::write_with_if_none_match. Some services, such
as s3, support if_not_exists but not if_none_match; use
WriteOptions::if_not_exists when you only need to guard against
an existing file.
if_version_match: Option<String>Write only when the file at the write path has this exact version.
The condition succeeds when the file exists and its version equals
this value. A file with a different version, or a missing file, fails
the write with crate::ErrorKind::ConditionNotMatch.
The operation returns crate::ErrorKind::Unsupported when the
service does not advertise
crate::Capability::write_with_if_version_match.
if_version_not_match: Option<String>Write only when the file at the write path does not have this version.
The condition succeeds when the file exists with a different version.
A file whose version equals this value fails the write with
crate::ErrorKind::ConditionNotMatch. When no file exists at the
write path, no portable behavior is defined.
The operation returns crate::ErrorKind::Unsupported when the
service does not advertise
crate::Capability::write_with_if_version_not_match.
if_not_exists: boolWrite only when no file exists at the write path.
The condition succeeds when the path is empty, so the write creates
the file. An existing file fails the write with
crate::ErrorKind::ConditionNotMatch.
The operation returns crate::ErrorKind::Unsupported when the
service does not advertise
crate::Capability::write_with_if_not_exists.
if_not_changed: Option<Metadata>Write only when the file at the write path still has the identity recorded in this metadata.
Pass metadata previously returned by OpenDAL for the same path.
OpenDAL derives a version match when the service supports version
conditions and the metadata contains a version. Otherwise it derives
an ETag match when possible. A changed or missing file fails the write
with crate::ErrorKind::ConditionNotMatch, as does combining this
option with a conflicting if_match or if_version_match value.
The operation returns crate::ErrorKind::Unsupported when the
service does not support the derived primitive condition, and
crate::ErrorKind::ConfigInvalid when the metadata contains neither
a version nor an ETag.
concurrent: usizeSets 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 crate::Capability::write_multi_min_size and crate::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§
§impl Clone for WriteOptions
impl Clone for WriteOptions
§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 more§impl Debug for WriteOptions
impl Debug for WriteOptions
§impl Default for WriteOptions
impl Default for WriteOptions
§fn default() -> WriteOptions
fn default() -> WriteOptions
§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 UnsafeUnpin for WriteOptions
impl UnwindSafe for WriteOptions
Blanket Implementations§
§impl<U> As for U
impl<U> As for U
§fn as_<T>(self) -> Twhere
T: CastFrom<U>,
fn as_<T>(self) -> Twhere
T: CastFrom<U>,
self to type T. The semantics of numeric casting with the as operator are followed, so <T as As>::as_::<U> can be used in the same way as T as U for numeric conversions. Read moreSource§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> 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.§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
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> Identity for Twhere
T: ?Sized,
impl<T> Identity for Twhere
T: ?Sized,
§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 more§impl<T> IntoRequest<T> for T
impl<T> IntoRequest<T> for T
§fn into_request(self) -> Request<T>
fn into_request(self) -> Request<T>
T in a tonic::RequestSource§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<L> LayerExt<L> for L
impl<L> LayerExt<L> for L
§fn named_layer<S>(&self, service: S) -> Layered<<L as Layer<S>>::Service, S>where
L: Layer<S>,
fn named_layer<S>(&self, service: S) -> Layered<<L as Layer<S>>::Service, S>where
L: Layer<S>,
Layered].§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> PolicyExt for Twhere
T: ?Sized,
impl<T> PolicyExt for Twhere
T: ?Sized,
§impl<T> Scope for T
impl<T> Scope 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.