我正在尝试将excel文件上传到我的WebApi和DO STUFF及其内容。 我有extJs部分通过上传按钮完成发送文件。 (以下代码)
我的问题是我不知道如何构建webApi部件来处理excel文件。我猜我必须有一个HttpPost。
假WebApi:
public string SampleUploadFile()
{
return _repo.UploadFile();
}
Extjs代码:
xtype: 'form',
//renderTo: 'fi-form', //(5)
fileUpload: true, //(1)
width: 500,
frame: true,
title: 'Position Sheet Upload Form',
bodyPadding: '10 10 0',
//bodyStyle: 'padding: 10px 10px 0 10px;',
defaults: {
anchor: '100%',
allowBlank: false,
msgTarget: 'side',
labelWidth: 50
},
//labelWidth: 50,
items: [{
xtype: 'fileuploadfield',
emptyText: 'Select an image',
fieldLabel: 'Image',
name: 'file', //(2)
buttonText: 'Choose a file'
}],
buttons: [{
text: 'Save',
handler: function () {
if (this.up('form').getForm().isValid()) {
this.up('form').getForm().submit({
url: 'Home/Upload',
waitMsg: 'Uploading your file...',
success: function (form, o) //(3)
{
Ext.Msg.show({
title: 'Result',
msg: o.result.result,
buttons: Ext.Msg.OK,
icon: Ext.Msg.INFO
});
},
failure: function (form, o) //(4)
{
Ext.Msg.show({
title: 'Result',
msg: o.result.error,
buttons: Ext.Msg.OK,
icon: Ext.Msg.ERROR
});
}
});
}
}
}]
有谁知道怎么做?我应该有一个参数是文件吗?
答案 0 :(得分:4)
你可以处理这样的文件:
public void UploadFile(HttpRequestMessage request)
{
HttpContext context = HttpContext.Current;
HttpPostedFile postedFile = context.Request.Files["file"];
// ...
}
答案 1 :(得分:1)
我想分享另一种使用 ExcelDataReader.DataSet 库在 WEB API 中处理 Upload and Read the EXCEL file 的方法。
[Route("ReadFile")]
[HttpPost]
public string ReadFile()
{
try
{
#region Variable Declaration
string message = "";
HttpResponseMessage ResponseMessage = null;
var httpRequest = HttpContext.Current.Request;
DataSet dsexcelRecords = new DataSet();
IExcelDataReader reader = null;
HttpPostedFile Inputfile = null;
Stream FileStream = null;
#endregion
#region Save Student Detail From Excel
using (dbCodingvilaEntities objEntity = new dbCodingvilaEntities())
{
if (httpRequest.Files.Count > 0)
{
Inputfile = httpRequest.Files[0];
FileStream = Inputfile.InputStream;
if (Inputfile != null && FileStream != null)
{
if (Inputfile.FileName.EndsWith(".xls"))
reader = ExcelReaderFactory.CreateBinaryReader(FileStream);
else if (Inputfile.FileName.EndsWith(".xlsx"))
reader = ExcelReaderFactory.CreateOpenXmlReader(FileStream);
else
message = "The file format is not supported.";
dsexcelRecords = reader.AsDataSet();
reader.Close();
if (dsexcelRecords != null && dsexcelRecords.Tables.Count > 0)
{
DataTable dtStudentRecords = dsexcelRecords.Tables[0];
for (int i = 0; i < dtStudentRecords.Rows.Count; i++)
{
Student objStudent = new Student();
objStudent.RollNo = Convert.ToInt32(dtStudentRecords.Rows[i][0]);
objStudent.EnrollmentNo = Convert.ToString(dtStudentRecords.Rows[i][1]);
objStudent.Name = Convert.ToString(dtStudentRecords.Rows[i][2]);
objStudent.Branch = Convert.ToString(dtStudentRecords.Rows[i][3]);
objStudent.University = Convert.ToString(dtStudentRecords.Rows[i][4]);
objEntity.Students.Add(objStudent);
}
int output = objEntity.SaveChanges();
if (output > 0)
message = "The Excel file has been successfully uploaded.";
else
message = "Something Went Wrong!, The Excel file uploaded has fiald.";
}
else
message = "Selected file is empty.";
}
else
message = "Invalid File.";
}
else
ResponseMessage = Request.CreateResponse(HttpStatusCode.BadRequest);
}
return message;
#endregion
}
catch (Exception)
{
throw;
}
}
您可以阅读此 article 以获得详细的分步说明。
答案 2 :(得分:0)
另一种可能的解决方案。 Web API方法使用ClosedXML nuget包来读取包含excel内容的流:
using ClosedXML.Excel;
public async void UploadFile()
{
var context = HttpContext.Current;
if (!Request.Content.IsMimeMultipartContent())
{
throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
}
var provider = new MultipartMemoryStreamProvider();
await Request.Content.ReadAsMultipartAsync(provider);
foreach (HttpContent ctnt in provider.Contents)
{
//now read individual part into STREAM
var stream = await ctnt.ReadAsStreamAsync();
if (stream.Length != 0)
{
//handle the stream here
using (XLWorkbook excelWorkbook = new XLWorkbook(stream))
{
var name = excelWorkbook.Worksheet(1).Name;
}
}
}
}