如何从HttpInputStream获取docx文件的字节数组?

我正在使用本文第一个答案中的方法: 如何从HttpPostedFile创建字节数组,但由于某种原因它不适用于.docx文件。

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

在.docx文件上fileData显示为{byte[0]} ,但它适用于pdfs,excel文件(xlsx),2007之前的word文件(doc)和图像(即值大于零)。 保存到数据库,fileData为0x

如何从HttpInputStream获取docx文件的字节数组?

UPDATE
我的web.config配置了

  

这适用于大于4MB的xslx文件,但小于80KB的docx文件不适用。

更新2
我可以使用此处说明的方法获取fileData: 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); 

但是,如果我将该字节数组保存到数据库并尝试写入文件,则会严重损坏。 在这种情况下保存到数据库看起来像0x00000000000000000000000...

更新3
这是整个控制器方法,虽然我不认为看到整个事情是必要的:

  [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 = String.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 = String.Format("A system error was encountered: {0}", ex) }, "text/x-json", JsonRequestBehavior.DenyGet); } } 

事实certificate,因为我已经使用了流(请参阅问题中的控制器方法),当我尝试保存它时它是空的。

我不确定为什么我用docx而不是xlsx来体验这个,因为他们都在保存前消耗了Streams。 我的猜测是它与Aspose.Cells和Aspose.Words实现的差异有关。

然而,无论如何,我将流上的位置设置为0,并且它有效。

 //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); }