Source code for apluslms_file_transfer.server.upload_utils
import os
import tarfile
[docs]def upload_octet_stream(temp_course_dir, file_data, file_index, chunk_index, last_chunk_flag):
""" Upload file data posted by a request with octet-stream content-type to the temp course directory.
The data may be the complete content of the file or a part of the file.
:param str temp_course_dir: the temporary directory that the file is uploaded to
:param file_data: the content of the file data (chunk)
:param int file_index: the index of the file in the uploaded file list
:param int chunk_index: the index of the uploaded chunk of the file
:param bool last_chunk_flag: the flag that indicates whether it is the last chunk of the file
"""
# parse data
try:
os.makedirs(temp_course_dir, exist_ok=True)
# write the compressed file
temp_compressed = os.path.join(temp_course_dir,
'temp_' + file_index + '.tar.gz')
with open(temp_compressed, 'ab') as f:
f.seek(0, os.SEEK_END)
file_size = f.tell()
if chunk_index == str(file_size):
f.write(file_data)
if last_chunk_flag: # The entire compressed file has been uploaded
# extract the compressed file to a 'temp' dir
with tarfile.open(temp_compressed, "r:gz") as tf:
tf.extractall(temp_course_dir)
os.remove(temp_compressed) # Delete the compressed file
except:
raise
[docs]def upload_form_data(file, temp_course_dir, framework='flask'):
""" Upload file data posted by a request with form-data content-type to the temp course directory
:param file: the content of the file
:param str temp_course_dir: the temporary directory that the file is uploaded to
:param str framework: the framework that the server is built by ('flask', 'django')
"""
try:
# write the compressed file
os.makedirs(temp_course_dir, exist_ok=True)
temp_compressed = os.path.join(temp_course_dir, 'temp.tar.gz')
with open(temp_compressed, 'wb') as f:
chunk_size = 4096
if framework == 'flask':
while True:
chunk = file.stream.read(chunk_size)
if len(chunk) == 0:
break
f.write(chunk)
elif framework == 'django':
for chunk in file.chunks():
f.write(chunk)
else:
raise ValueError("Unsupported framework")
# extract the compression file
with tarfile.open(temp_compressed, "r:gz") as tf:
tf.extractall(temp_course_dir)
os.remove(temp_compressed) # delete the compression file
except:
raise