public ActionResult Import(HttpPostedFileBase currencyConversionsFile)
{
string filename = "CurrencyConversion Upload_" + DateTime.Now.ToString("dd-MM-yyyy") + ".csv";
string folderPath = Server.MapPath("~/Files/");
string filePath = Server.MapPath("~/Files/" + filename);
currencyConversionsFile.SaveAs(filePath);
string[] csvData = System.IO.File.ReadAllLines(filePath);
//the later code isn't show here
}
Run Code Online (Sandbox Code Playgroud)
我知道将httppostedfilebase转换为String数组的常用方法,它首先将文件存储在服务器中,然后从服务器读取数据.无论如何直接从httppostedfilebase获取字符串数组而不将文件存储到服务器中?
早上好 - 我试图将HttpPostedFileBase(它总是一个简单的CSV文件)保存到会话变量,如下所示:
[HttpPost]
public ActionResult Index(HttpPostedFileBase importFile) {
Session.Remove("NoteImport");
var noteImport = new NoteImport { ImportFile = importFile, HeaderList = NoteService.HeaderList(importFile) };
Session["NoteImport"] = noteImport;
return RedirectToAction("FileNote");
}
Run Code Online (Sandbox Code Playgroud)
如您所见,我将importFile转储到我的NoteImport类中.目前,ImportFile属性是可公开访问的HttpPostedFileBase类型.
我第一次在我的服务中使用此属性(创建标题值列表的方法),我没有问题:
public List<string> HeaderList(HttpPostedFileBase fileStream) {
var sr = new StreamReader(fileStream.InputStream);
var headerString = sr.ReadLine();
var headerArray = headerString.Split(',');
var headerList = new List<string>();
foreach (var header in headerArray) {
if (!ValidateHeader(header))
throw new InvalidDataException("Invalid header name: " + header);
headerList.Add(header);
}
return headerList;
}
Run Code Online (Sandbox Code Playgroud)
以上工作正常,并返回我目前所需要的.
我的问题是下面的代码.当我调用ReadLine()时,它不会从HttpPostedFileBase中获取任何内容.
public List<string> ImportFileStream(HttpPostedFileBase …Run Code Online (Sandbox Code Playgroud) 当我尝试将图像上传到我的MVC控制器操作并且存在验证错误时,我必须单击每个按钮并再次查找我的所有文件.
如果我有一个包含的视图
<input type="file" id="file0" name="Files[0]" />
<input type="file" id="file1" name="Files[1]" />
Run Code Online (Sandbox Code Playgroud)
和控制器动作一样
public ActionResult Create(ModelClass model, IEnumerable<HttpPostedFileBase> Files)
{
if(ModelState.IsValid)
{
//do work
if(PhotoValidation.IsValid(Files))
{
//do work
}
else
{
ModelState.AddModelError("","Photos not valid");
}
}
return view(model); // Way to return photos back to the view on modelstate error?
}
Run Code Online (Sandbox Code Playgroud)
文件很好地发布到服务器,但是如果有模型验证错误,有没有办法返回模型和文件,以便用户不必再次上传它们?
我在视图模型上正确地发布了图像并绑定到HttpPostedFileBase属性,但是当我在视图模型的基类中放置相同的属性时,它不会对绑定字节进行建模.它仍然显示图像名称,但不显示内容流.
我测试了我能想到的一切.请帮忙!
这些图片讲述了整个故事:

提前致谢.如果有什么不清楚,请告诉我.
UPDATE
我认为这是一个合法的错误.在发布SO之前,我尝试了以下所有建议(截至1/26).我还尝试过:1.将基本属性创建为虚拟并在子类中重写它2.在子类中创建一个新属性,仅获取/设置基本属性
我的解决方案远非优雅,是在子类上添加"临时"属性,而MVC操作方法中的第一件事就是将基本属性设置为它.我希望有一个真正的解决方案,我可以恢复这个修道院并做正确的修复.
我使用标准HTML <input>控件发布多部分表单数据将大文件上载到ASP.NET服务器.这是一个ASP.NET MVC应用程序.
根据MSDN,HttpPostedFile该类缓冲到磁盘开箱即用:
"文件以MIME multipart/form-data格式上传.默认情况下,大于256 KB的所有请求(包括表单字段和上传文件)都缓冲到磁盘,而不是保存在服务器内存中."
我想这意味着,当我访问HttpPostedFileBase我的控制器,当我访问HttpPostedFileBase的InputStream财产,我可以写某个文件缓冲区,而不必担心运行内存的服务器,这显然是一个不可行的解决方案.
这里有一些关于我如何处理每个传入文件的伪代码HttpPostedFileBase.
for(var i = 0; i< Request.Files.Count;i++)
{
var fileBase = Request.Files[i];
if (fileBase.ContentLength == 0)
{
continue;
}
// One thread per file
ThreadPool.QueueUserWorkItem(state =>
{
// Read from fileBase.InputStream
},
null);
}
Run Code Online (Sandbox Code Playgroud)
我的web.config的httpRuntime块如下所示:
<httpRuntime
executionTimeout="1200"
requestLengthDiskThreshold="2097151"
maxRequestLength="2097151"
useFullyQualifiedRedirectUrl="false"
minFreeThreads="8"
minLocalRequestFreeThreads="4"
appRequestQueueLimit="100" />
Run Code Online (Sandbox Code Playgroud)
我的实现工作,多个文件按预期上传,除了服务器消耗缓冲整个有效负载所需的相同内存量.我必须假设InputStream正在缓冲所有内容.当我上传的文件多于我的内存时,它可以预测会崩溃OutOfMemoryException.这是上传800mb文件时内存峰值的图像.

我知道我可以使用Flash/Silverlight小部件或编写自定义HttpModule来截取上传并自己处理它们,但是如果HttpPostedFileMSDN说它做了什么(或者我做错了),当前的要求将完美无缺.
首先,这是我的代码:
private Shoe ProcessForm(Shoe shoe, HttpPostedFileBase image)
{
try
{
shoe.Slug = CMSHelper.SanitizeTitle(shoe.Name);
shoe.LastModification = DateTime.Now;
if ((image != null) && (image.ContentLength > 0))
{
string fileName = String.Concat(shoe.ShoeId, Path.GetExtension(image.FileName));
shoe.Image = fileName;
string filePath = Path.Combine(Server.MapPath(shoe.ImagePath), fileName);
image.SaveAs(filePath);
}
}
catch (Exception e)
{
throw e;
}
return shoe;
}
Run Code Online (Sandbox Code Playgroud)
在本地,这段代码工作正常.目录的权限很好.并且它在其他服务器上随机工作(我在测试VPS提供程序时在4或5个不同的服务器上测试了此代码).
但是,如果我尝试从我的家用计算机运行它,一切都顺利通过,数据库中保存了一个文件名但没有上传文件.没有例外!!!
我一直试图解决这个问题差不多三天而且这么多无用的时间,请帮助我......我只是不明白这有什么问题......
目标:
将带有UTF-8字符的CSV文件上传/发布到MVC操作,读取数据并将其粘贴到数据库表中.
问题:
只有纯文本字符才能通过.像á这样的UTF-8"特殊"字符没有正确传递,在代码和数据库中它们呈现为此字符=> .
更多:
我确信这不是我的C#代码的问题,尽管我已经包含了下面的重要部分.
我认为问题是上传的文件是以纯文本或"纯文本"MIME类型编码的,但我可以通过将文件扩展名更改为.html来更改它
摘要:
如何获得一个enctype属性设置为"multipart/form-data"的表单,以正确解释已发布文件中的UTF-8字符?
研究:
从我的研究来看,这似乎是一个普遍的问题,没有一个共同和明确的解决方案
我发现了比.Net更多的java和PHP解决方案.
csvFile变量的类型为HttpPostedFileBase
这是MVC动作签名
[HttpPost]
public ActionResult LoadFromCsv(HttpPostedFileBase csvFile)
我试过的事情:
1)
using (Stream inputStream = csvFile.InputStream)
{
byte[] bytes = ReadFully(inputStream);
string bytesConverted = new UTF8Encoding().GetString(bytes);
}
Run Code Online (Sandbox Code Playgroud)
2)
using (Stream inputStream = csvFile.InputStream)
{
using (StreamReader readStream = new StreamReader(inputStream, Encoding.UTF8, true))
{
while (!readStream.EndOfStream)
{
string csvLine = readStream.ReadLine();
// string csvLine = new UTF8Encoding().GetString(new UTF8Encoding().GetBytes(readStream.ReadLine())); // stupid... this can not be the way!
}
}
}
Run Code Online (Sandbox Code Playgroud)
3) …
我正在使用 ASP.NET MVC 4,我正在尝试获取上传文件的路径,以便打开和操作它。这就是我继续的方式:
控制器
public ActionResult Bulk(HttpPostedFileBase file)
{
FileStream fs = System.IO.File.Open(Server.MapPath(file.FileName),
FileMode.Open, FileAccess.Read);
return RedirectToAction("Index");
}
Run Code Online (Sandbox Code Playgroud)
看法
@{
ViewBag.Title = "Index";
}
<h2>Index</h2>
@using (Html.BeginForm("Bulk", "Bulk", null, FormMethod.Post, new
{ enctype = "multipart/form-data" }))
{
@Html.ValidationSummary(true)
<fieldset>
<p>
<input type="file" name="file"/>
</p>
<div class="form-actions">
<button type="submit" class="btn btn-primary">Create</button>
</div>
</fieldset>
}
Run Code Online (Sandbox Code Playgroud)
当我这样做时,我收到一个错误,说... Could not find a part of the path ...
如何获取文件实际所在的路径?
我正在尝试将文件作为HttpPostedFileBase传递给我的Controller,因此我可以解析文件并将信息传递回页面.例如,我想允许用户导入vCard,并让它自动填充联系人创建表单PartialView.
我想通过传入文件,填充我的模型然后返回页面的PartialView来显示在页面上.我试过像下面的jQuery,但我永远不能让我的HttpPostedFileBase正确传递(总是为null).请记住,我需要在发布后访问文件的InputStream.
var file = "files=" + $("#fileInput").files[0];
$.post("/Contacts/UploadContact/", file, function (returnHtml) {
alert(returnHtml);
$("#contactContainer").html(returnHtml);
});
Run Code Online (Sandbox Code Playgroud)
是否可以通过jQuery将文件作为HttpPostedFileBase发布到我的Controller?
我知道有很多像这样的问题,但是我把它们全部读出来并且它们无效解决了我的问题.下面我将展示我在视图和控制器中的代码,以便您可以了解我的代码.
View :
<td><% using (Html.BeginForm("Index", "Home", FormMethod.Post, new {enctype = "multipart/form-data"})) { %>
<%: Html.ValidationSummary(true) %>
<div id="section1">
<div class="editor-label">
<%: Html.LabelFor(model => model.Name) %>
</div>
<label for="file">Filename:</label>
<input type="file" name="myfile" id="File5" value="Choose File Banner1" />
<p> </p>
And here is my controller:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Index(HomeModel model, string submitButton, HttpPostedFileBase myfile)
{
Run Code Online (Sandbox Code Playgroud)
我无法弄清楚问题是什么问题..请有人帮助我
asp.net-mvc ×7
c# ×4
file-upload ×3
.net ×1
asp.net ×1
filepath ×1
inputstream ×1
jquery ×1
modelstate ×1
upload ×1
utf-8 ×1