Сейчас я использую Fine-Uploader в качестве внешнего интерфейса, а python - flask в качестве внутреннего. Что мне нужно сделать, так это то, что мне нужно отправить большие файлы из внешнего интерфейса на мой сервер. Я могу сделать это легко без одновременного разбиения. Но как только я включу его, файл будет поврежден. Я думаю, это потому, что когда вы одновременно используете чанк, я предполагаю, что часть 7 может быть добавлена до добавления части 5. Опять же, одновременное чанкинг - это нормально, поскольку оно последовательное.
Мне нужно знать, существует ли какая-то временная глобальная переменная или способ, которым я могу временно хранить части чанка. Я попытался Redis, но, к сожалению, когда я получаю данные из Redis, он показывает ошибку декодирования, потому что, вероятно, Redis пытается превратить его в строку, когда мне просто нужно, чтобы быть байтами.
Если все остальное не удается, я Я просто go прибегну к моему последнему средству, которое состоит в том, чтобы поместить детали в их собственные небольшие файлы, а затем открыть их позже, чтобы объединить их по одному.
Вот мой код для вашей справки. На нем все еще есть методы redis.
def upload_temp_file_part(redis, request):
try:
# Remember the paramName was set to 'file', we can use that here to grab it
file = request.files['qqfile']
uuid = request.form['qquuid']
part = request.form['qqpartindex']
offset = request.form['qqpartbyteoffset']
key_content = 'file_content_' + uuid + part
key_offset = 'file_offset_' + uuid + part
value_content = file.stream.read()
value_offset = offset
logging.info("Setting part " + part + " of " + uuid)
redis.set(key_content, value_content)
redis.set(key_offset, value_offset)
except Exception as e:
logging.error(e)
def combine_temp_file_part(redis, request):
try:
uuid = request.form['qquuid']
total_parts = request.form['qqtotalparts']
save_path = os.path.join(os.getenv('UPLOAD_FOLDER_TEMP'), uuid)
with open(save_path, 'ab') as f:
for index in range(0, int(total_parts)):
key_content = 'file_content_' + uuid + str(index)
key_offset = 'file_offset_' + uuid + str(index)
logging.info("Get part " + str(index) + " of " + uuid)
value_content = redis.get(key_content)
value_offset = redis.get(key_offset)
if value_content is None or value_offset is None:
pass
# Throw Error
logging.info("Placing part " + str(index) + " of " + uuid)
f.seek(value_offset)
f.write(value_content)
redis.delete(value_offset)
redis.delete(value_content)
except Exception as e:
logging.error(e)