Как получить массив байтов из 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]}, но он работает с PDF-файлами, файлами Excel (xlsx), файлами Word до 2007 года (doc) и изображениями (т. Е. Значение больше нуля). Сохраненный в базе данных fileData - 0x.

Как получить массив байтов из HttpInputStream для файла docx?

ОБНОВЛЕНИЕ
Мой web.config настроен с

<httpRuntime targetFramework="4.5" maxRequestLength="102400" />

Это работает с файлами xslx размером более 4 МБ, но с файлами docx менее 80 КБ - нет.

ОБНОВЛЕНИЕ 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);

        }
    }

person wilsjd    schedule 07.10.2013    source источник
comment
Файл docx не должен обрабатываться иначе, чем файл любого другого типа.   -  person Trevor Elliott    schedule 07.10.2013
comment
Нет причин для этого. Что значит пустой? filedata null? а никаких исключений не выкинули?   -  person Vivek    schedule 07.10.2013
comment
Вероятно, что файл больше разрешенного размера загрузки, если другие файлы работают. См. Этот пост, stackoverflow.com/questions/288612/, чтобы настроить этот размер файла.   -  person Mike Perrenoud    schedule 07.10.2013
comment
@neo Дело не в том, что файлы слишком большие, мы говорим о 71 КБ для некоторых из них, а в моем web.config есть <httpRuntime targetFramework="4.5" maxRequestLength="102400" />   -  person wilsjd    schedule 07.10.2013
comment
@Vivek хороший вопрос, я обновил свой вопрос   -  person wilsjd    schedule 07.10.2013
comment
@TrevorElliott, я тоже об этом думал, но сообщения вроде этого заставляют меня думать иначе: stackoverflow.com/questions/18243668/   -  person wilsjd    schedule 07.10.2013
comment
Шаг устранения неполадок: создайте файл .txt, переименуйте в .docx, загрузите-сохраните-загрузите / запишите в файл и посмотрите, будет ли это вести себя по-другому   -  person Moho    schedule 08.10.2013
comment
также, покажите весь метод контроллера, пожалуйста   -  person Moho    schedule 08.10.2013
comment
Файл .txt, переименованный в .docx, кажется похожим - он возвращается поврежденным.   -  person wilsjd    schedule 08.10.2013
comment
@TrevorElliott, позвольте пояснить - я не хочу относиться к этому по-другому и тоже не собираюсь. Я бы предпочел один метод для извлечения байтов.   -  person wilsjd    schedule 08.10.2013
comment
Хороший вызов @Moho, ранее в методе я использовал поток.   -  person wilsjd    schedule 08.10.2013


Ответы (1)


Оказывается, поскольку я уже использую поток (см. Метод контроллера в вопросе), он пуст, когда я пытался его сохранить.

Я не уверен, почему я испытал это с docx, а не с xlsx, поскольку у них обоих потоки потреблялись до сохранения. Я предполагаю, что это как-то связано с различиями в реализациях 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);
}
person wilsjd    schedule 08.10.2013