Загрузка проблемы с BLOB-объектами JavaScript
Я пытаюсь записать видео (уже работающее) с использованием HTML5-тега видео "getUserMedia" для доступа к камере устройства и API MediaRecorder для захвата кадров и Angular1 для обработки загрузки файлов. Теперь у меня возникают проблемы с загрузкой Blob на мой PHP-сервер, который работает на Laravel, в настоящее время у меня есть 2 способа загрузить видео, во-первых, это "ng-click", это работает нормально, но когда я программно загружаю Blob, используя тот же Функция, которая запускается "ng-click", похоже, нарушает mimeType моего BLOB-объекта. Вот как выглядит мой код.
$scope.uploader = function() {
let fData = new FormData();
let blob = new Blob($scope.chunk, { type: 'video/webm' });
fData.append('vid', blob)
$http.post(url, fData, {
transformRequest: angular.identity,
headers: {'Content-Type': undefined},
}, success, error)
})
$timeout(function() {
$scope.uploader();
}, 10000)
Эта проблема здесь, когда "$scope.uploader()" вызывается с использованием "ng-click", он работает нормально, но при вызове метода "uploader" с использованием "$timeout" кажется, что mimeType меняется на "application/octet" поток ", который вызывает проблему.
2 ответа
Здравствуйте, попробуйте этот код,
function base64ToBlob(base64Data, contentType) {
contentType = contentType || '';
var sliceSize = 1024;
var byteCharacters = atob(base64Data);
var bytesLength = byteCharacters.length;
var slicesCount = Math.ceil(bytesLength / sliceSize);
var byteArrays = new Array(slicesCount);
for (var sliceIndex = 0;sliceIndex <slicesCount;++sliceIndex) {
var begin = sliceIndex * sliceSize;
var end = Math.min(begin + sliceSize, bytesLength);
var bytes = new Array(end - begin);
for (var offset = begin, i = 0;offset <end;++i, ++offset) {
bytes[i] = byteCharacters[offset].charCodeAt(0);
}
byteArrays[sliceIndex] = new Uint8Array(bytes);
}
return new Blob(byteArrays, {
type: contentType});
}
Определить сферу
$scope.onFile = function(blob) {
Cropper.encode((file = blob)).then(function(dataUrl) {
$scope.dataUrl = dataUrl;
$scope.odataUrl = dataUrl;
$timeout(showCropper); // wait for $digest to set image's src
});
};
Отправить метод
$scope.uploadImage = function () {
if ($scope.myCroppedImage === '')
{
}
$scope.msgtype = "";
$scope.msgtxt = "";
var fd = new FormData();
var imgBlob = dataURItoBlob($scope.myCroppedImage);
fd.append('clogo', imgBlob);
fd.append('actionfile', 'editimage');
$http.post(
'../user/user_EditCompany.php',
fd, {
transformRequest: angular.identity,
headers: {
'Content-Type': undefined
}
}
)
.success(function (response) {
// console.log(response);
if (response.status == 'success')
{
//your code
}else{
//your code
}
})
.error(function (response) {
console.log('error', response);
});
};
function dataURItoBlob(dataURI) {
var binary = atob(dataURI.split(',')[1]);
var mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0];
var array = [];
for (var i = 0; i < binary.length; i++) {
array.push(binary.charCodeAt(i));
}
return new Blob([new Uint8Array(array)], {
type: mimeString
});
}
Спасибо, проблема была вызвана ограничением загрузки и публикации в моем php.ini.