Dropzone 块上传到 Azure 存储
Dropzone chunk uploading to Azure Storage
我正在尝试使用 dropzone 通过 SAS(共享访问签名)将大文件直接上传到 Azure 存储。这是在 Azure 端记录的:https://docs.microsoft.com/en-us/rest/api/storageservices/Put-Block
所以我必须获取 blockId(一个 Base64 字符串,用于标识我正在发送的数据块)并将其放入发送该数据块的请求的 url 中。
Dropzone 现在支持分块,所以我决定使用它。不幸的是,它的实现很难找到。
我可以更改处理事件中的 url,但这是针对每个文件的,我无法从中获取块数据。
我可以使用参数在表单数据中发送 blockId,但似乎无法从中更改 url。
是否可以将 blockId 添加到我的 url?还是我必须先将它发送到我的服务器并从那里上传?谢谢
$("#videoSection").dropzone({
params: function (files, xhr, chunk) {
console.log(chunk);
xhr.setRequestHeader('x-ms-blob-type', 'BlockBlob');
//I can get the blockId from the chunk here
//this.options.url.replace("test") //doesn't work
//xhr.open(this.options.method, this.options.url.replace("test"), true); //doesn't work
return {"url": "test"}; //this returns form-data
},
url: "Create",
method: "PUT",
//headers: { "x-ms-blob-type": "BlockBlob" },
chunking: true,
chunkSize: 4000000,
forceChunking: true,
retryChunks: true,
retryChunksLimit: 3,
autoProcessQueue: false,
acceptedFiles: "video/*",
maxFiles: 1,
maxFilesize: 3000,
previewTemplate: $("#videoTemplate").html(),
dictDefaultMessage: "Drop Video Here",
init: function () {
this.on("processing", function (file) {
var blockId = 1;
@*this.options.url = "@(Config.Value.StoragePrefix)/@(user.Company.StorageName)/inspections/@Model.InspectionData.Inspection.Id/videos/"
+ file.name + "@Html.Raw(Model.SharedAccessSignature + "&comp=block&blockid=")" + blockId;*@
var progressBar = $(file.previewElement).find(".dropzoneProgressBar");
progressBar.show();
});
this.on("chunksUploaded", function (file, done) {
$.ajax({
type: "PUT",
url: "@(Config.Value.StoragePrefix)/@(user.Company.StorageName)/inspections/@Model.InspectionData.Inspection.Id/videos/"
+ file.name + "@Html.Raw(Model.SharedAccessSignature + "&comp=blocklist")",
success: function (data) {
done();
},
error: function (e) {
toastr.error(e);
console.log(e);
}
});
});
this.on("uploadprogress", function (file, progress, bytesSent) {
var progressBar = $(file.previewElement).find(".dropzoneProgressBar");
progress = bytesSent / file.size * 100;
progressBar.width(progress + "%");
});
this.on("success", function (file, response) {
var successCheckmark = $(file.previewElement).find(".dropSuccess");
successCheckmark.toggle();
var progressBar = $(file.previewElement).find(".dropzoneProgressBar");
progressBar.css("background-color", "green");
});
}
});
此行有问题 this.options.url.replace("test") //doesn't work
。应该是this.options.url = this.options.url.replace("test", "newValue") //this should work
。我正在使用类似的方法。问题是 params
回调在 XmlHttpRequest
打开后被调用,因此您需要在开始处理文件之前为第一个块设置 url 并在 params
您需要为要发送的下一个块设置 url(使用 chunk.index + 1
用于基于零的索引)。我不确定如果您启用了 parallelChunkUploads
这是否可行 - 我没有测试要处理的第一个块是否是第一个块。如果您需要更多信息,请告诉我。
我正在尝试使用 dropzone 通过 SAS(共享访问签名)将大文件直接上传到 Azure 存储。这是在 Azure 端记录的:https://docs.microsoft.com/en-us/rest/api/storageservices/Put-Block
所以我必须获取 blockId(一个 Base64 字符串,用于标识我正在发送的数据块)并将其放入发送该数据块的请求的 url 中。
Dropzone 现在支持分块,所以我决定使用它。不幸的是,它的实现很难找到。
我可以更改处理事件中的 url,但这是针对每个文件的,我无法从中获取块数据。
我可以使用参数在表单数据中发送 blockId,但似乎无法从中更改 url。
是否可以将 blockId 添加到我的 url?还是我必须先将它发送到我的服务器并从那里上传?谢谢
$("#videoSection").dropzone({
params: function (files, xhr, chunk) {
console.log(chunk);
xhr.setRequestHeader('x-ms-blob-type', 'BlockBlob');
//I can get the blockId from the chunk here
//this.options.url.replace("test") //doesn't work
//xhr.open(this.options.method, this.options.url.replace("test"), true); //doesn't work
return {"url": "test"}; //this returns form-data
},
url: "Create",
method: "PUT",
//headers: { "x-ms-blob-type": "BlockBlob" },
chunking: true,
chunkSize: 4000000,
forceChunking: true,
retryChunks: true,
retryChunksLimit: 3,
autoProcessQueue: false,
acceptedFiles: "video/*",
maxFiles: 1,
maxFilesize: 3000,
previewTemplate: $("#videoTemplate").html(),
dictDefaultMessage: "Drop Video Here",
init: function () {
this.on("processing", function (file) {
var blockId = 1;
@*this.options.url = "@(Config.Value.StoragePrefix)/@(user.Company.StorageName)/inspections/@Model.InspectionData.Inspection.Id/videos/"
+ file.name + "@Html.Raw(Model.SharedAccessSignature + "&comp=block&blockid=")" + blockId;*@
var progressBar = $(file.previewElement).find(".dropzoneProgressBar");
progressBar.show();
});
this.on("chunksUploaded", function (file, done) {
$.ajax({
type: "PUT",
url: "@(Config.Value.StoragePrefix)/@(user.Company.StorageName)/inspections/@Model.InspectionData.Inspection.Id/videos/"
+ file.name + "@Html.Raw(Model.SharedAccessSignature + "&comp=blocklist")",
success: function (data) {
done();
},
error: function (e) {
toastr.error(e);
console.log(e);
}
});
});
this.on("uploadprogress", function (file, progress, bytesSent) {
var progressBar = $(file.previewElement).find(".dropzoneProgressBar");
progress = bytesSent / file.size * 100;
progressBar.width(progress + "%");
});
this.on("success", function (file, response) {
var successCheckmark = $(file.previewElement).find(".dropSuccess");
successCheckmark.toggle();
var progressBar = $(file.previewElement).find(".dropzoneProgressBar");
progressBar.css("background-color", "green");
});
}
});
此行有问题 this.options.url.replace("test") //doesn't work
。应该是this.options.url = this.options.url.replace("test", "newValue") //this should work
。我正在使用类似的方法。问题是 params
回调在 XmlHttpRequest
打开后被调用,因此您需要在开始处理文件之前为第一个块设置 url 并在 params
您需要为要发送的下一个块设置 url(使用 chunk.index + 1
用于基于零的索引)。我不确定如果您启用了 parallelChunkUploads
这是否可行 - 我没有测试要处理的第一个块是否是第一个块。如果您需要更多信息,请告诉我。