Когда пользователь выбрал файл, который хочет загрузить, и нажал кнопку мыши. При нажатии кнопки загрузки происходит следующее:
- Вызывается 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;
}
}
Код: Выделить всё
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.");
}
Доступ к выборке по адресу '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
Мобильная версия