gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 09:08:09 26 4
gpt4 key购买 nike

我正在使用这篇文章第一个答案中的方法:How to create byte array from 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)、2007 年之前的 word 文件 (doc)和图像(即值大于零)。保存到数据库,fileData为0x

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

更新
我的 web.config 配置有

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

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

更新 2
我可以使用此处说明的方法获取要填充的文件数据: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
这是整个 Controller 方法,但我认为没有必要看到整个事情:

    [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);

}
}

最佳答案

事实证明,因为我已经在使用流(请参阅问题中的 Controller 方法),所以当我尝试保存它时它是空的。

我不确定为什么我使用 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);
}

关于c# - 如何从 HttpInputStream 获取 docx 文件的字节数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19232932/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com