Je crée un MultiPartStreamProvider personnalisé pour stocker des fichiers dans Azure File Storage dans le cadre d'une opération de transfert & Shift d'une application héritée. Le client utilise AngularJS sur le frontal et WebAPI sur le backend. Lorsque j'essaie d'utiliser MultipartStreamProvider, je dois implémenter GetStream pour renvoyer un flux dans lequel écrire. J'utilise cloudFile.OpenWrite qui demande la taille du flux/fichier qui sera écrit dessus. Cependant, dans GetStream, ContentDisposition.Size est vide. Est-ce que je peux soit faire en sorte que AngularJS envoie la taille de contenu pour chaque fichier ou sur le backend, peut-être que je peux creuser la taille du flux de fichier d'ailleurs? Toute aide serait grandement appréciée. Merci!Comment obtenir la taille de fichier dans MultipartStreamProvider GetStream lorsqu'il est manquant dans ContentDisposition
MultipartStreamProvider
public override Stream GetStream(HttpContent parent, HttpContentHeaders headers)
{
// For form data, Content-Disposition header is a requirement
ContentDispositionHeaderValue contentDisposition = headers.ContentDisposition;
Console.WriteLine(files.Count);
if (contentDisposition != null)
{
// create default filename if its missing
contentDisposition.FileName = (String.IsNullOrEmpty(contentDisposition.FileName) ? $"{Guid.NewGuid()}.data" : contentDisposition.FileName);
// We won't post process files as form data
_isFormData.Add(false);
CloudMultipartFileData fileData = new CloudMultipartFileData(headers, _fileRepository.BaseUrl, contentDisposition.FileName);// your - aws - filelocation - url - maybe);
_fileData.Add(fileData);
var azureStream = _fileRepository.GetWriteStream(contentDisposition.Size, _relativeDirectory, fileData.FileName);
return azureStream;
// We will post process this as form data
_isFormData.Add(true);
}
throw new InvalidOperationException("Did not find required 'Content-Disposition' header field in MIME multipart body part..");
}
appel réel à Azure
public override Stream GetWriteStream(long? fileSize, string relativeDirectory, string filename)
{
var combinedRelativeDirectory = GetCloudDirectory(relativeDirectory);
CloudFile cloudFile = combinedRelativeDirectory.GetFileReference(filename);
return cloudFile.OpenWrite(fileSize, null, null);
}
AngularJS File Upload code
/********************************** Add/Upload Photos **************************************/
$scope.$watch('files', function (files) {
$scope.formUpload = false;
console.log(files);
if (files != null) {
for (var i = 0; i < files.length; i++) {
$scope.errorMsg = null;
(function (file) {
upload(file);
})(files[i]);
}
}
});
function upload(file) {
file.upload = Upload.upload({
url: window.location.origin + "/api/mydocs/uploadfile?storeFolder=" + $scope.attachmentFolder + "&storeId=" + $scope.storeId + "&userId=" + $scope.currentUser.UserId,
method: 'POST',
headers: {},
fields: {},
file: file
});