В настоящее время я использую этот код для выбора видеофайла с локального диска (через веб-страницу с использованием) и отправки его на мой API:
<form enctype="multipart/form-data">
<input name="file" type="file" accept="video/*"/>
<input type="button" value="Upload" />
</form>
<progress></progress>
<script language="javascript" type="text/javascript">
$(document).ready(function(){
$(':file').on('change', function () {
var file = this.files[0];
if (file.type !== "video/mp4" && file.type!== "video/quicktime") {
alert("Content must be video .mp4 or .mov")
}
$(':button').on('click', function () {
if (file.type == "video/mp4" || file.type == "video/quicktime"){
$.ajax({
// Your server script to process the upload
url: 'azureAPI',
type: 'POST',
// Form data
data: new FormData($('form')[0]),
// Tell jQuery not to process data or worry about content-type
// You *must* include these options!
cache: false,
contentType: false,
processData: false,
// Custom XMLHttpRequest
xhr: function () {
var myXhr = $.ajaxSettings.xhr();
if (myXhr.upload) {
// For handling the progress of the upload
myXhr.upload.addEventListener('progress', function (e) {
if (e.lengthComputable) {
$('progress').attr({
value: e.loaded,
max: e.total,
});
}
}, false);
}
return myXhr;
}
});
} else {
alert ("File type must be .mp4 or .mov")
}
});
});
});
</script>
Это отправляет (что я предполагаю, что) двоичные данные в форма этого:
���
1!QAa"q2B���R�#3br��u�����S6C$%��5�cts�T&D4��U��d���e!1AQa2"q�#����3��B���X"��?��!=��W�u�ٗ�-2���?����ۯ�Կ�i���t����M���Y�-��-Vdϊ�P�<�<U#TY]K��dW
���
Я считаю, что это включает в себя границы webkitform et c.
Я сейчас пытаюсь сохранить эти двоичные данные в блочный блоб, однако у меня возникли проблемы сохранение двоичных данных в Azure блочном блоке с использованием:
var buf = Buffer.from(req.body, 'binary');
blobService.createBlockBlobFromText(container, 'fileName.mp4', buf, {contentSettings: {contentType: 'video/mp4', contentEncoding: 'binary'}}, function (error, result, response) {
if(!error){
callback('uploaded');
} else {
callback('nope');
}
});
Я также пытался создать читаемый поток:
var container = 'abc';
var azure = require('azure-storage');
const getStream = require('into-stream');
var blobService = azure.createBlobService();
module.exports = function (context, req) {
var json = req.body;
save (context, json, function(result){
context.log(result);
context.done();
})
}
function save (context, json, callback){
var buf = Buffer.from(json);
var stream = getStream(buf);
var streamLength = buf.length;
blobService.createBlockBlobFromStream(container, 'fileName.mp4', stream, streamLength, {contentSettings: {contentType: 'video/mp4'}}, function (error, result, response) {
if(!error) {
callback('uploaded');
} else {
callback('nope');
}
});
}
Я пробовал это сначала без contentSettings, но это сохранил данные как contentType: application / octet-stream, который не открывался как видео. Затем я добавил contentType и, наконец, попытался также добавить contentEncoding.
Это сохранило правильный contentType, но видео все равно не удалось открыть.
Кто-нибудь знает, как сохранить двоичные данные в * 1024? * хранение блобов с помощью этого метода? Кажется, что файл сохраняется, но при попытке открыть его он поврежден / неправильно закодирован? Я не уверен в проблеме. Возможно, мне нужно удалить границу webkitform et c из нее перед сохранением?
Спасибо за любые указатели, извинения, если я что-то пропустил.