在我的本地机器上,一切正常,但是..
发布我的MVC4
Web 项目后,上传的 Excel 文件出现问题。我加载了一个HttpPostedFileBase
并将路径发送到我的 BL。在那里,我将其加载到dataTable
,然后在第二次通话时将其发送到list
.
这是代码..
控制器:
[HttpPost]
public ActionResult UploadCards(HttpPostedFileBase file, string sheetName, int ProductID)
{
try
{
if (file == null || file.ContentLength == 0)
throw new Exception("The user not selected a file..");
var fileName = Path.GetFileName(file.FileName);
var path = Server.MapPath("/bin");
if (!Directory.Exists(path))
Directory.CreateDirectory(path);
path = Path.Combine(path, fileName);
file.SaveAs(path);
DataTable cardsDataTable = logic.LoadXLS(path, sheetName);
cardsToUpdate = logic.getUpdateCards(cardsDataTable, ProductID);
foreach (var item in cardsToUpdate)
{
if (db.Cards.ToList().Exists(x => x.SerialNumber == item.SerialNumber))
cardsToUpdate.Remove(item);
}
Session["InfoMsg"] = "click update to finish";
}
catch (Exception ex)
{
Session["ErrorMsg"] = ex.Message;
}
return View("viewUploadCards", cardsToUpdate);
}
提单:
public DataTable LoadXLS(string strFile, String sheetName)
{
DataTable dtXLS = new DataTable(sheetName);
try
{
string strConnectionString = "";
if (strFile.Trim().EndsWith(".xlsx"))
strConnectionString = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties="Excel 12.0 Xml;HDR=YES;IMEX=1";", strFile);
else if (strFile.Trim().EndsWith(".xls"))
strConnectionString = string.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties="Excel 8.0;HDR=Yes;IMEX=1";", strFile);
OleDbConnection SQLConn = new OleDbConnection(strConnectionString);
SQLConn.Open();
OleDbDataAdapter SQLAdapter = new OleDbDataAdapter();
string sql = "SELECT * FROM [" + sheetName + "$]";
OleDbCommand selectCMD = new OleDbCommand(sql, SQLConn);
SQLAdapter.SelectCommand = selectCMD;
SQLAdapter.Fill(dtXLS);
SQLConn.Close();
}
catch (Exception ex)
{
string res = ex.Message;
return null;
}
return dtXLS;
}
和:
public List<Card> getUpdateCards(DataTable dt, int prodId)
{
List<Card> cards = new List<Card>();
try
{
Product product = db.Products.Single(p => p.ProductID == prodId);
foreach (DataRow row in dt.Rows)
{
cards.Add(new Card
{
SerialNumber = row[0].ToString(),
UserName = row[1].ToString(),
Password = row[2].ToString(),
Activated = false,
Month = product.Months,
Bandwidth = product.Bandwidth,
ProductID = product.ProductID,
// Product = product
});
}
}
catch (Exception ex)
{
db.Log.Add(new Log { LogDate = DateTime.Now, LogMsg = "Error : " + ex.Message });
}
return cards;
}
现在我认为Windows Azure
不允许我保存此文件,因为在中间视图中,当我应该看到数据时 - 我没有看到它。
我想了一些方法...一个 - 不保存文件,但我看不到如何完成ConnectionString
......其次,也许有一种方法可以将文件保存在那里。
我很想得到解决这个问题的建议...
10倍,对不起我的英语不好=)
尴尬,但我在这里发现了一个类似的问题。不完全是,但它给了我一个很好的方向。
兔子最终结果:
[HttpPost]
public ActionResult UploadCards(HttpPostedFileBase file, string sheetName, int ProductID)
{
IExcelDataReader excelReader = null;
try
{
if (file == null || file.ContentLength == 0)
throw new Exception("The user not selected a file..");
if (file.FileName.Trim().EndsWith(".xlsx"))
excelReader = ExcelReaderFactory.CreateOpenXmlReader(file.InputStream);
else if (file.FileName.Trim().EndsWith(".xls"))
excelReader = ExcelReaderFactory.CreateBinaryReader(file.InputStream);
else
throw new Exception("Not a excel file");
cardsToUpdate = logic.getUpdateCards(excelReader.AsDataSet().Tables[sheetName], ProductID);
foreach (var item in cardsToUpdate)
{
if (db.Cards.ToList().Exists(x => x.SerialNumber == item.SerialNumber))
cardsToUpdate.Remove(item);
}
Session["InfoMsg"] = "Click Update to finish";
}
catch (Exception ex)
{
Session["ErrorMsg"] = ex.Message;
}
finally
{
excelReader.Close();
}
return View("viewUploadCards", cardsToUpdate);
}
10q 全部。
编辑:下载,参考和使用
DLL是Avalibale野兔我添加对 Excel 的引用.dll并使用 Excel 添加
问题可能是由将文件写入磁盘引起的。云提供商通常不允许应用程序写入磁盘。
在您的情况下,文件似乎只是临时写入磁盘,并直接加载到数据库中。您应该能够直接从上传的文件打开流并将其直接写入数据库 - 而无需写入磁盘。
检查您在会话中储存的异常 - 您应该在那里找到更多信息。
@hoonzis是正确的,不允许将文件写入云中的磁盘(您不能事件获取或设置文件的路径)。应该使用 Blob 存储,它对文件的效率要高得多,并且比 sql 便宜。我建议使用表存储服务,它是noSQL,但它比azure sql便宜。仅当 Azure SQL 是解决方案的必备条件时,才使用 Azure SQL。
Blob 存储在此处查看更多详细信息:http://www.windowsazure.com/en-us/develop/net/how-to-guides/blob-storage/
表存储:http://www.windowsazure.com/en-us/develop/net/how-to-guides/table-services/
有关选择正确存储的更多信息,您可以在此处找到:http://www.windowsazure.com/en-us/develop/net/fundamentals/cloud-storage-scenarios/