Ich versuche, mehrere Dateien in ASP.NET MVC hochzuladen, und ich habe diese einfache foreach-Schleife in meinem Controller
foreach (HttpPostedFileBase f in Request.Files)
{
if (f.ContentLength > 0)
FileUpload(f);
}
Der vorherige Code generiert diesen Fehler:
Unable to cast object of type 'System.String' to type 'System.Web.HttpPostedFile'.
Was ich nicht verstehe, ist, warum Request.Files [1] eine HttpPostedFileBase zurückgibt, aber wenn es wiederholt wird, gibt es Zeichenfolgen zurück (vermutlich die Dateinamen).
Hinweis: Ich weiß, dass dies mit einer for-Schleife gelöst werden kann. Außerdem habe ich versucht, HttpPostedFile mit demselben Fehler zu verwenden.
quelle
HttpPostedFileBase
anstelle von verwendeHttpPostedFile
.Mit meinem Tab HTML ist:
<input class="valid" id="file" name="file" multiple="" type="file">
Request.Files hat einen doppelten Namen im Array. Sie sollten also folgendermaßen lösen:
for (int i = 0; i < Request.Files.Count; i++ ){ HttpPostedFileBase fileUpload = Request.Files[i];
quelle
file.FileName
. Wenn Sie dies mitforeach
doppelten Namen tun, wird die erste Datei mehrmals gespeichertWir können LINQ verwenden, um dies zu tun, und trotzdem foreach verwenden, wie gefragt:
var files = Enumerable.Range(0, Request.Files.Count) .Select(i => Request.Files[i]); foreach (var file in files) { // file.FileName }
Wie @tvanfosson sagte, gibt der Enumerator die Dateinamen als Zeichenfolgen zurück, nicht als
HttpPostedFileBase
. Diese MethodeHttpPostedFileBase this[string name]
gibt das gewünschte Objekt zurück. WennHttpFileCollectionBase
implementiertIEnumerable<HttpPostedFileBase>
, könnten wir das foreach normal machen. Es wird jedoch eine nicht generische implementiertIEnumerable
.quelle
Sie können versuchen, die Zeichenfolgen zu iterieren und stattdessen wie folgt in HttpPostedFile umzuwandeln:
foreach (string file in Request.Files) { HttpPostedFile hFile = Request.Files[file] as HttpPostedFile; if (hFile.ContentLength > 0) FileUpload(hFile); }
quelle
Leider hat die Antwort von tvanfosson bei mir nicht funktioniert. Obwohl die Dateien problemlos hochgeladen werden und kein Fehler ausgegeben wird, tritt ein Problem auf, bei dem nur eine der Dateien verwendet wird, sodass dieselbe Datei zweimal gespeichert wird, anstatt beide zu verwenden.
Es schien ein Problem mit der foreach-Anweisung zu sein, die die Namen jeder Datei in den Request.Files durchläuft. Aus irgendeinem Grund funktionierte sie für mich nicht als Schlüssel, und jedes Mal wurde nur die erste Datei ausgewählt.
HttpFileCollectionBase files = Request.Files; for(var i = 0; i < files.Count; i++) { HttpPostedFileBase file = files[i]; ... }
quelle
Der folgende Code hat bei mir funktioniert.
HttpResponseMessage result = null; var httpRequest = System.Web.HttpContext.Current.Request; HttpFileCollection uploadFiles = httpRequest.Files; var docfiles = new List<string>(); if (httpRequest.Files.Count > 0){ int i; for (i = 0; i < uploadFiles.Count; i++) { HttpPostedFile postedFile = uploadFiles[i]; var filePath = @"C:/inetpub/wwwroot/test1/reports/" + postedFile.FileName; postedFile.SaveAs(filePath); docfiles.Add(filePath); } result = Request.CreateResponse(HttpStatusCode.Created, docfiles); } else { result = Request.CreateResponse(HttpStatusCode.BadRequest); } return result; }
quelle
Sie können das
HttpPostedFile
aus derHttpFileCollection
Verwendungforeach
wie folgt herausholen:foreach (var obj in fileCollection) { HttpPostedFile file = fileCollection.Get(obj.ToString()); }
quelle