Upload utility for filenames
| 231 | |
| 232 | |
| 233 | class UploadFilenameInputManager(UploadInputManager): |
| 234 | """Upload utility for filenames""" |
| 235 | |
| 236 | @classmethod |
| 237 | def is_compatible(cls, upload_source): |
| 238 | return isinstance(upload_source, str) |
| 239 | |
| 240 | def stores_body_in_memory(self, operation_name): |
| 241 | return False |
| 242 | |
| 243 | def provide_transfer_size(self, transfer_future): |
| 244 | transfer_future.meta.provide_transfer_size( |
| 245 | self._osutil.get_file_size(transfer_future.meta.call_args.fileobj) |
| 246 | ) |
| 247 | |
| 248 | def requires_multipart_upload(self, transfer_future, config): |
| 249 | return transfer_future.meta.size >= config.multipart_threshold |
| 250 | |
| 251 | def get_put_object_body(self, transfer_future): |
| 252 | # Get a file-like object for the given input |
| 253 | fileobj, full_size = self._get_put_object_fileobj_with_full_size( |
| 254 | transfer_future |
| 255 | ) |
| 256 | |
| 257 | # Wrap fileobj with interrupt reader that will quickly cancel |
| 258 | # uploads if needed instead of having to wait for the socket |
| 259 | # to completely read all of the data. |
| 260 | fileobj = self._wrap_fileobj(fileobj) |
| 261 | |
| 262 | callbacks = self._get_progress_callbacks(transfer_future) |
| 263 | close_callbacks = self._get_close_callbacks(callbacks) |
| 264 | size = transfer_future.meta.size |
| 265 | # Return the file-like object wrapped into a ReadFileChunk to get |
| 266 | # progress. |
| 267 | return self._osutil.open_file_chunk_reader_from_fileobj( |
| 268 | fileobj=fileobj, |
| 269 | chunk_size=size, |
| 270 | full_file_size=full_size, |
| 271 | callbacks=callbacks, |
| 272 | close_callbacks=close_callbacks, |
| 273 | ) |
| 274 | |
| 275 | def yield_upload_part_bodies(self, transfer_future, chunksize): |
| 276 | full_file_size = transfer_future.meta.size |
| 277 | num_parts = self._get_num_parts(transfer_future, chunksize) |
| 278 | for part_number in range(1, num_parts + 1): |
| 279 | callbacks = self._get_progress_callbacks(transfer_future) |
| 280 | close_callbacks = self._get_close_callbacks(callbacks) |
| 281 | start_byte = chunksize * (part_number - 1) |
| 282 | # Get a file-like object for that part and the size of the full |
| 283 | # file size for the associated file-like object for that part. |
| 284 | fileobj, full_size = self._get_upload_part_fileobj_with_full_size( |
| 285 | transfer_future.meta.call_args.fileobj, |
| 286 | start_byte=start_byte, |
| 287 | part_size=chunksize, |
| 288 | full_file_size=full_file_size, |
| 289 | ) |
| 290 |