Ошибка CORS при вызовах службы хранилища Azure из Javascript для фиксации фрагментированных загрузокPython

Программы на Python
Ответить
Anonymous
 Ошибка CORS при вызовах службы хранилища Azure из Javascript для фиксации фрагментированных загрузок

Сообщение Anonymous »

Я хочу, чтобы пользователи загружали огромные файлы непосредственно в хранилище Azure. У меня есть веб-приложение Flask Python, но я не хочу, чтобы файл загружался на мой веб-сервер из-за ограничений по размеру.
Когда пользователь выбрал файл, который хочет загрузить, и нажал кнопку мыши. При нажатии кнопки загрузки происходит следующее:
  • Вызывается API, который генерирует URL-адрес SAS и имя большого двоичного объекта, которое нужно назначить загружаемому файлу. Код, генерирующий оба:

Код: Выделить всё

    blob_name = str(uuid.uuid4())

container_name = os.environ[default_container_name_setting]

sas = generate_blob_sas(account_name=service.account_name,
account_key=access_key,
container_name=container_name,
blob_name=blob_name,
permission=BlobSasPermissions(write=True, read=True, create=True),
expiry=datetime.utcnow() + timedelta(hours=2))

sas_url = 'https://' + service.account_name + '.blob.core.windows.net/' + container_name + '/' + blob_name + '?' + sas
return sas_url, blob_name
  • Затем файл загружается частями с помощью Javascript:

Код: Выделить всё

const chunkSize = 1024 * 1024 * 20;
const totalChunks = Math.ceil(file.size / chunkSize);
const blockIds = []; // Array to hold block IDs

for (let i = 0; i < totalChunks; i++) {
const start = i * chunkSize;
const end = Math.min(start + chunkSize, file.size);
const chunk = file.slice(start, end);
const blockId = btoa("block-" + i); // Base64 encode block ID
blockIds.push(blockId);

// Upload each chunk
const uploadResponse = await fetch(sas_url + "&comp=block&blockid=" + blockId, {
method: "PUT",
headers: {
"x-ms-blob-type": "BlockBlob",
"Content-Type": file.type
},
body: chunk
});

if (!uploadResponse.ok) {
return false;
}
}
До этого момента это работает. Однако следующим шагом будет указание Azure объединить фрагменты, по-прежнему с помощью Javascript:

Код: Выделить всё

const commitResponse = await fetch(sas_url + "&comp=commitBlockList", {
method: "PUT",
headers: {
"Content-Type": "application/xml",
"x-ms-version": "2020-10-02",
"Content-Length": "0"
},
body: `${blockIds.map(id => `${id}`).join('')}`
});

if (!commitResponse.ok) {
throw new Error("Failed to commit blocks to blob.");
}
На этом этапе я всегда получаю ошибку CORS:

Доступ к выборке по адресу 'https://xxx.blob.core.windows.net/conta ... 17dc567?se =2024-11-01T04%2A18%3B30Q&sp=rcw&sv=2024-11-04&sr=b&sig=Cudr...&comp=commitBlockList' из источника «http://localhost:4449» заблокирован политикой CORS: ответ на предполетный запрос не проходит проверку контроля доступа: в запрошенном ресурсе отсутствует заголовок «Access-Control-Allow-Origin». Если непрозрачный ответ соответствует вашим потребностям, установите режим запроса «no-cors», чтобы получить ресурс с отключенным CORS.

Я знаю, что правильно сделал установите CORS в хранилище Azure, поскольку часть загрузки работает.
На вкладке «Служба BLOB-объектов» я добавил источник локального хоста с разрешенными методами GET, POST, OPTIONS и PUT.
Я попробовал восстановить другой URL-адрес SAS с полученным именем большого двоичного объекта, но все равно получаю ошибку CORS.
Что мне не хватает?
Обновление: Я сузил ошибку CORS до строки запроса «&comp=commitBlockList», добавленной к URL-адресу SAS на этапе фиксации. Однако я до сих пор не знаю, как решить эту проблему.

Подробнее здесь: https://stackoverflow.com/questions/791 ... ed-uploads
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»