Comment obtenir un tableau d’octets à partir de HttpInputStream pour un fichier docx?

J’utilise la méthode de la première réponse de cet article: Comment créer un tableau d’octets à partir de HttpPostedFile mais cela ne fonctionne pas pour les fichiers .docx pour une raison quelconque

//viewmodel.File is HttpPostedFileBase byte[] fileData; using (var binaryReader = new BinaryReader(viewModel.File.InputStream)) { fileData = binaryReader.ReadBytes(viewModel.File.ContentLength); } 

Sur les fichiers .docx, fileData indique {byte[0]} , mais fonctionne avec les fichiers PDF, les fichiers Excel (xlsx), les fichiers de mots antérieurs à 2007 (doc) et les images (la valeur est supérieure à zéro). Enregistré dans la firebase database, le fileData est 0x .

Comment obtenir un tableau d’octets à partir de HttpInputStream pour un fichier docx?

METTRE À JOUR
Mon web.config est configuré avec

  

Cela fonctionne avec des fichiers xslx de plus de 4 Mo mais les fichiers docx de moins de 80 Ko ne le sont pas.

MISE À JOUR 2
Je peux obtenir que fileData remplisse à l’aide de la méthode décrite ici: http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.fileupload.postedfile.aspx

 byte[] fileData = new byte[viewModel.File.ContentLength]; viewModel.File.InputStream.Read(fileData, 0, viewModel.File.ContentLength); 

Mais si j’ai sauvegardé ce tableau d’octets dans la firebase database et essayé d’écrire un fichier, il est gravement corrompu. Enregistré dans la firebase database dans ce cas, il ressemble à 0x00000000000000000000000...

MISE À JOUR 3
Voici toute la méthode du contrôleur, bien que je ne pense pas que voir tout cela soit nécessaire:

  [HttpPost] public ActionResult SaveChangeFile(AttachmentFormViewModel viewModel) { if (viewModel.File == null) return Json(new { success = false, message = "No file was found, please select a file and try again." }, "text/x-json", JsonRequestBehavior.DenyGet); try { //Validate that the right kind of File has been uploaded OperationResponse response = _attachmentProcessor.ValidateAttachmentContentType(viewModel.File, (ChangeFileTypeEnum)viewModel.FileType); if (!response.IsSuccess) return Json(new { success = response.IsSuccess, message = response.Message }, "text/x-json", JsonRequestBehavior.DenyGet); UpdateProjectFromCostCalculatorRequest projectValues = null; Workbook workbook = null; Document document = null; if (_attachmentProcessor.IsWorkbook(viewModel.File)) workbook = new Workbook(viewModel.File.InputStream); if (_attachmentProcessor.IsDocument(viewModel.File)) document = new Document(viewModel.File.InputStream); var filename = Path.GetFileName(viewModel.File.FileName); //if cost calc, validate that the values are correct and update related project switch ((ChangeFileTypeEnum)viewModel.FileType) { case ChangeFileTypeEnum.CostCalculator: response = _attachmentProcessor.ValidateCostCalculator(workbook, filename); if (response.IsSuccess) projectValues = _attachmentProcessor.GetDataFromCostCalculator(workbook); break; case ChangeFileTypeEnum.DataValidation: response = _attachmentProcessor.ValidateDataValidation(workbook); break; case ChangeFileTypeEnum.WorkPaper: response = _attachmentProcessor.ValidateWorkPaper(document); break; } //return error message if any of the validations above failed if (!response.IsSuccess) return Json(new { success = response.IsSuccess, message = response.Message }, "text/x-json", JsonRequestBehavior.DenyGet); //get the file from the stream and put into a byte[] for saving the database byte[] fileData; using (var binaryReader = new BinaryReader(viewModel.File.InputStream)) { fileData = binaryReader.ReadBytes(viewModel.File.ContentLength); } var file = new ChangeFile { ChangeRequestID = viewModel.ChangeRequestId, ChangeFileTypeID = viewModel.FileType, File = fileData, Filename = filename, ContentType = viewModel.File.ContentType, CreatedBy = User.UserNameWithoutDomain(), UpdatedBy = User.UserNameWithoutDomain(), CreatedDate = DateTime.Now, UpdatedDate = DateTime.Now }; _changeRequestService.SaveChangeFile(file); var log = new ChangeFileImportLog { CreatedDate = DateTime.Now }; switch ((ChangeFileTypeEnum)viewModel.FileType) { case ChangeFileTypeEnum.CostCalculator: var project = _changeRequestService.GetChangeProjectByPsrs(file.ChangeRequestID, projectValues.PsrsNumber); if (project != null) { _attachmentProcessor.UpdateChangeProjectWithProjectValues(project, projectValues); log.NumberOfErrors = 0; log.NumberOfSegmentChanges = 0; log.NumberOfWarnings = 0; } else { log.NumberOfWarnings = 1; log.Warnings = Ssortingng.Format( "There is no project on this Change Request with PSRS \"{0}\". If there was, the new cost would be updated with \"{1:C0}\"", projectValues.PsrsNumber, projectValues.Cost); } break; case ChangeFileTypeEnum.DataValidation: log = _attachmentProcessor.CreateChangeSegmentsFromDataValidation(workbook, file.ChangeRequestID, file.ChangeFileID, User); break; case ChangeFileTypeEnum.WorkPaper: log = _attachmentProcessor.UpdateChangeProjectsFromWorkPaper(document, file.ChangeRequestID, file.ChangeFileID, User); break; } log.CreatedBy = User.UserNameWithoutDomain(); log.CreatedDate = DateTime.Now; log.UpdatedBy = User.UserNameWithoutDomain(); log.UpdatedDate = DateTime.Now; _changeRequestService.SaveChangeFileImportLog(log, file.ChangeFileID); _changeRequestService.Commit(); return Json(new { success = response.IsSuccess, message = response.Message }, "text/x-json", JsonRequestBehavior.DenyGet); } catch (Exception ex) { return Json(new { success = false, message = Ssortingng.Format("A system error was encountered: {0}", ex) }, "text/x-json", JsonRequestBehavior.DenyGet); } } 

Il se trouve que, puisque j’utilise déjà le stream (voir la méthode du contrôleur dans la question), il est vide lorsque j’ai essayé de le sauvegarder.

Je ne suis pas sûr de savoir pourquoi j’ai expérimenté cela avec docx et non xlsx car ils ont tous les deux consommé leurs stream avant la sauvegarde. Je suppose que cela a quelque chose à voir avec les différences entre les implémentations Aspose.Cells et Aspose.Words.

Quoi qu’il en soit, cependant, j’ai remis la position sur le stream à 0 et cela a fonctionné.

 //viewmodel.File is HttpPostedFileBase viewModel.File.InputStream.Position = 0; //<-----This fixed it! byte[] fileData; using (var binaryReader = new BinaryReader(viewModel.File.InputStream)) { fileData = binaryReader.ReadBytes(viewModel.File.ContentLength); }