Как скачать файл с блоба и отправить в него ответ на файл - PullRequest
0 голосов
/ 08 октября 2019

У меня есть страница клиента, на которой будут перечислены все файлы в контейнере, при выборе файла имя файла вместе с именем контейнера отправляется на сервер. Сервер должен инициировать загрузку файла и отправить файл в ответ на запрос клиента, см. Изображение ниже:

client download window

Я пытался с get_blob_to_stream

@app.route("/blobs/testDownload/")
def testDownload():
  container_name =request.args.get("containerName")
  print(container_name)
  local_file_name= request.args.get("fileName")

  with BytesIO() as input_blob:
     with BytesIO() as output_blob:

    # Download as a stream
        block_blob_service.get_blob_to_stream(container_name, local_file_name, input_blob)
        copyfileobj(input_blob, output_blob)
        newFile = str(output_blob.getvalue())
        with open("file.txt","a") as f:
            f.write(newFile)
            f.close()

return send_file('file.txt',attachment_filename='sample.txt',as_attachment=True,mimetype='text/plain')

Но загружаемый файл находится в формате только текстового файла, я хочу скачать файл независимо от его формата. и я знаю, что это неправильный способ загрузки файла через Web API.

Пожалуйста, предложите мне способ сделать это

Ответы [ 2 ]

0 голосов
/ 08 октября 2019

Вы используете фиксированное имя файла "file.txt" для всех больших двоичных объектов, которые могут быть причиной. Использование потока кажется здесь бесполезным. вместо этого попробуйте get_blob_to_path (), проверьте следующий измененный код:

--- // ваш код // ---

block_blob_service.get_blob_to_path (имя_ контейнера, local_file_name, local_file_name )
# обратите внимание, что я здесь повторно использую local_file_name , следовательно, никакие двоичные объекты ввода / вывода не требуются, возвращают send_file (local_file_name, attachment_filename = local_file_name, as_attachment = True, mimetype = ''text / plain ')


Полный код:

@app.route("/blobs/testDownload/")
 def testDownload():
 container_name =request.args.get("containerName")
 print(container_name)
 local_file_name= request.args.get("fileName")

# Download as a file
block_blob_service.get_blob_to_path(container_name, local_file_name, local_file_name)


return send_file(local_file_name,attachment_filename=local_file_name,as_attachment=True,mimetype='text/plain')

Проверьте, работает ли это!

0 голосов
/ 08 октября 2019

старайтесь не кодировать расширение жестко, так как расширение является частью имени BLOB-объекта, какой бы метод вы не использовали из документации . Посмотрите на метод get_blob_to_path, поскольку вы сначала загружаете файл локально. Локальное имя файла совпадает с именем файла в контейнере BLOB-объектов.

Вы можете попытаться получить имя blob.name для каждого файла BLOB-объекта в контейнере. Имя BLOB-объекта содержит расширение файла (вы просто должны его проанализировать), которое вы можете использовать в качестве параметра для вышеуказанного метода, , и таким образом вам не нужно жестко его кодировать : ниже вы можете найтипример того, как вы можете перебирать файлы в контейнере и получать имя BLOB-объекта, и вы можете просто настроить его для своего варианта использования :

block_blob_service = BlockBlobService(account_name=accountName, account_key=accountKey)

# create container if not exists called 'batches'
container_name ='batches'
block_blob_service.create_container(container_name)

# Set the permission so the blobs are public.
block_blob_service.set_container_acl(container_name, public_access=PublicAccess.Container)

# Calculation

blobs = block_blob_service.list_blobs(container_name)

for blob in blobs.items:
    file_name = blob.name

Так что теперь вы можете использоватьимя_файла и метод split для '/', а последним элементом является имя_файла.extension.

...