Где я могу временно хранить байтовые данные на сервере python flask? - PullRequest
0 голосов
/ 01 апреля 2020

Сейчас я использую 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)
...