Skip to content

Commit 5d2f231

Browse files
zhuxiaolong37huiguangjun
authored andcommitted
the uploader supports progress.
1 parent 42cf268 commit 5d2f231

File tree

5 files changed

+261
-1
lines changed

5 files changed

+261
-1
lines changed

alibabacloud_oss_v2/checkpoint.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -265,7 +265,7 @@ def __init__(
265265
h.update(absfilepath.encode())
266266
src_hash = h.hexdigest()
267267

268-
if len(basedir) == 0:
268+
if basedir is None or len(basedir) == 0:
269269
dirbase = gettempdir()
270270
else:
271271
dirbase = os.path.dirname(basedir)

alibabacloud_oss_v2/uploader.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -439,6 +439,7 @@ def adjust_source(self):
439439
self._reader_pos = next_offset
440440
self._part_number = part_number + 1
441441
self._ccrc = ccrc
442+
self._transferred = next_offset
442443

443444

444445
def set_reader(self, reader) ->IO[bytes]:
@@ -691,6 +692,10 @@ def _update_upload_result(self, result):
691692
if self._check_crc and hash_crc64 is not None:
692693
self._ccrc = Crc64.combine(self._ccrc, int(hash_crc64), size)
693694

695+
self._transferred += size
696+
if self._request.progress_fn is not None:
697+
self._request.progress_fn(size, self._transferred, self._total_size)
698+
694699

695700
def _assert_crc_same(self, headers: MutableMapping):
696701
if not self._check_crc:

sample/progress_uploader_file.py

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
import argparse
2+
import alibabacloud_oss_v2 as oss
3+
4+
parser = argparse.ArgumentParser(description="progress upload file sample")
5+
parser.add_argument('--region', help='The region in which the bucket is located.', required=True)
6+
parser.add_argument('--bucket', help='The name of the bucket.', required=True)
7+
parser.add_argument('--endpoint', help='The domain names that other services can use to access OSS')
8+
parser.add_argument('--key', help='The name of the object.', required=True)
9+
parser.add_argument('--file_path', help='The path of Upload file.', required=True)
10+
11+
12+
class UploadProgress:
13+
def __init__(self):
14+
self.bytes_transferred = 0
15+
16+
def __call__(self, increment, written, total):
17+
self.bytes_transferred += increment
18+
rate = int(100 * (float(written) / float(total)))
19+
print(f'\r{rate}% ', end='')
20+
21+
22+
def main():
23+
24+
args = parser.parse_args()
25+
26+
# Loading credentials values from the environment variables
27+
credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()
28+
29+
# Using the SDK's default configuration
30+
cfg = oss.config.load_default()
31+
cfg.credentials_provider = credentials_provider
32+
cfg.region = args.region
33+
if args.endpoint is not None:
34+
cfg.endpoint = args.endpoint
35+
36+
client = oss.Client(cfg)
37+
38+
up_loader = client.uploader(part_size=100*1024,
39+
parallel_num=5,
40+
leave_parts_on_error=True,
41+
enable_checkpoint=True,
42+
)
43+
44+
# Create progress tracker
45+
progress_tracker = UploadProgress()
46+
47+
result = up_loader.upload_file(oss.PutObjectRequest(
48+
bucket=args.bucket,
49+
key=args.key,
50+
progress_fn=progress_tracker,
51+
), filepath=args.file_path)
52+
53+
print(vars(result))
54+
55+
56+
57+
if __name__ == "__main__":
58+
main()

sample/progress_uploader_from.py

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
import argparse
2+
import alibabacloud_oss_v2 as oss
3+
4+
parser = argparse.ArgumentParser(description="progress upload from sample")
5+
parser.add_argument('--region', help='The region in which the bucket is located.', required=True)
6+
parser.add_argument('--bucket', help='The name of the bucket.', required=True)
7+
parser.add_argument('--endpoint', help='The domain names that other services can use to access OSS')
8+
parser.add_argument('--key', help='The name of the object.', required=True)
9+
parser.add_argument('--file_path', help='The path of Upload file.', required=True)
10+
11+
12+
class UploadProgress:
13+
def __init__(self):
14+
self.bytes_transferred = 0
15+
16+
def __call__(self, increment, written, total):
17+
self.bytes_transferred += increment
18+
rate = int(100 * (float(written) / float(total)))
19+
print(f'\r{rate}% ')
20+
21+
22+
def main():
23+
24+
args = parser.parse_args()
25+
26+
# Loading credentials values from the environment variables
27+
credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()
28+
29+
# Using the SDK's default configuration
30+
cfg = oss.config.load_default()
31+
cfg.credentials_provider = credentials_provider
32+
cfg.region = args.region
33+
if args.endpoint is not None:
34+
cfg.endpoint = args.endpoint
35+
36+
client = oss.Client(cfg)
37+
38+
up_loader = client.uploader()
39+
40+
# up_loader = client.uploader(part_size=100*1024,
41+
# parallel_num=5,
42+
# leave_parts_on_error=True,
43+
# enable_checkpoint=True,
44+
# checkpoint_dir=args.file_path)
45+
46+
# Create progress tracker
47+
progress_tracker = UploadProgress()
48+
49+
with open(file=args.file_path, mode='rb') as f:
50+
result = up_loader.upload_from(oss.PutObjectRequest(
51+
bucket=args.bucket,
52+
key=args.key,
53+
progress_fn=progress_tracker,
54+
), reader=f)
55+
56+
print(vars(result))
57+
58+
if __name__ == "__main__":
59+
main()
60+

tests/integration/test_client.py

Lines changed: 137 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4500,3 +4500,140 @@ def _progress_fn(n, written, total):
45004500
self.assertEqual("Multipart", hresult.object_type)
45014501
self.assertEqual(src_crc64, hresult.hash_crc64)
45024502

4503+
4504+
class TestUploader(TestIntegration):
4505+
def test_uploader_progress_with_single_upload(self):
4506+
length = 100 * 1024 + 123
4507+
data = random_str(length)
4508+
object_name = OBJECTNAME_PREFIX + random_str(16)
4509+
4510+
global bytes_added, total_bytes_transferred, total_bytes_expected, last_written
4511+
bytes_added = 0
4512+
total_bytes_transferred = 0
4513+
total_bytes_expected = 0
4514+
last_written = 0
4515+
4516+
def _progress_fn(n, written, total):
4517+
global last_written
4518+
global bytes_added
4519+
global total_bytes_transferred
4520+
global total_bytes_expected
4521+
4522+
n = written - last_written
4523+
bytes_added += n
4524+
total_bytes_transferred = written
4525+
last_written = written
4526+
total_bytes_expected = total
4527+
4528+
uploader = self.client.uploader()
4529+
4530+
result = uploader.upload_from(oss.PutObjectRequest(
4531+
bucket=self.bucket_name,
4532+
key=object_name,
4533+
progress_fn=_progress_fn
4534+
), io.StringIO(data),
4535+
part_size=500 * 1024,
4536+
parallel_num=5,
4537+
leave_parts_on_error=True
4538+
)
4539+
self.assertIsNotNone(result)
4540+
self.assertEqual(200, result.status_code)
4541+
self.assertEqual(total_bytes_transferred, length)
4542+
self.assertEqual(total_bytes_expected, length)
4543+
4544+
hresult = self.client.head_object(oss.HeadObjectRequest(
4545+
bucket=self.bucket_name,
4546+
key=object_name
4547+
))
4548+
self.assertEqual("Normal", hresult.object_type)
4549+
self.assertEqual(length, hresult.content_length)
4550+
4551+
def test_uploader_progress_with_single_multipart(self):
4552+
length = 500 * 1024 + 123
4553+
data = random_str(length)
4554+
object_name = OBJECTNAME_PREFIX + random_str(16)
4555+
4556+
global bytes_added, total_bytes_transferred, total_bytes_expected, last_written
4557+
bytes_added = 0
4558+
total_bytes_transferred = 0
4559+
total_bytes_expected = 0
4560+
last_written = 0
4561+
4562+
def _progress_fn(n, written, total):
4563+
global last_written
4564+
global bytes_added
4565+
global total_bytes_transferred
4566+
global total_bytes_expected
4567+
4568+
n = written - last_written
4569+
bytes_added += n
4570+
total_bytes_transferred = written
4571+
last_written = written
4572+
total_bytes_expected = total
4573+
4574+
uploader = self.client.uploader()
4575+
result = uploader.upload_from(oss.PutObjectRequest(
4576+
bucket=self.bucket_name,
4577+
key=object_name,
4578+
progress_fn=_progress_fn
4579+
), io.StringIO(data),
4580+
part_size=100 * 1024,
4581+
parallel_num=1,
4582+
leave_parts_on_error=True,
4583+
)
4584+
self.assertIsNotNone(result)
4585+
self.assertEqual(200, result.status_code)
4586+
self.assertEqual(total_bytes_transferred, length)
4587+
self.assertEqual(total_bytes_expected, length)
4588+
4589+
hresult = self.client.head_object(oss.HeadObjectRequest(
4590+
bucket=self.bucket_name,
4591+
key=object_name
4592+
))
4593+
self.assertEqual("Multipart", hresult.object_type)
4594+
self.assertEqual(length, hresult.content_length)
4595+
4596+
def test_uploader_progress_with_thread_multipart(self):
4597+
length = 500 * 1024 + 123
4598+
data = random_str(length)
4599+
object_name = OBJECTNAME_PREFIX + random_str(16)
4600+
4601+
global bytes_added, total_bytes_transferred, total_bytes_expected, last_written
4602+
bytes_added = 0
4603+
total_bytes_transferred = 0
4604+
total_bytes_expected = 0
4605+
last_written = 0
4606+
4607+
def _progress_fn(n, written, total):
4608+
global last_written
4609+
global bytes_added
4610+
global total_bytes_transferred
4611+
global total_bytes_expected
4612+
4613+
n = written - last_written
4614+
bytes_added += n
4615+
total_bytes_transferred = written
4616+
last_written = written
4617+
total_bytes_expected = total
4618+
4619+
uploader = self.client.uploader()
4620+
result = uploader.upload_from(oss.PutObjectRequest(
4621+
bucket=self.bucket_name,
4622+
key=object_name,
4623+
progress_fn=_progress_fn
4624+
), io.StringIO(data),
4625+
part_size=100 * 1024,
4626+
parallel_num=3,
4627+
leave_parts_on_error=True,
4628+
)
4629+
self.assertIsNotNone(result)
4630+
self.assertEqual(200, result.status_code)
4631+
self.assertEqual(total_bytes_transferred, length)
4632+
self.assertEqual(total_bytes_expected, length)
4633+
4634+
hresult = self.client.head_object(oss.HeadObjectRequest(
4635+
bucket=self.bucket_name,
4636+
key=object_name
4637+
))
4638+
self.assertEqual("Multipart", hresult.object_type)
4639+
self.assertEqual(length, hresult.content_length)

0 commit comments

Comments
 (0)