HttpPostedFileBase.SaveAs arbeiten, aber keine Datei hochgeladen und keine Ausnahmen
Erste, hier ist mein code:
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;
}
Lokal, dieser code funktioniert einwandfrei. Verzeichnisse die Berechtigungen sind in Ordnung. Und es hat vorher funktioniert nach dem Zufallsprinzip auf anderen Servern (getestet habe ich den code auf 4 oder 5 verschiedenen Servern, während ich Tests wurden VPS-Anbieter).
Aber wenn ich versuche, führen Sie es von meinem computer zu Hause, alles geht in Ordnung, es ist ein file-name in der Datenbank gespeichert, aber keine Datei wird hochgeladen. Und es sind keine Ausnahmen gegeben!!!
Ich habe versucht, dies zu beheben, für fast drei Tage, und so viele unnütze Stunden, bitte helft mir... ich weiß nur nicht sehen, was falsch mit dieser...
- Bitte halten Sie Dinge wie "C#/ASP.NET MVC 3: "aus deinem Titel. Das sind tags, und gehören in die tags, nicht in Ihrem Titel.
- Auch, verwenden Sie nicht
try {} catch (Exception e){throw e;}
. Wenn du gehst, das zu tun, dann sind Sie besser dran, ohne die try/catch-block überhaupt. Ihr code Müll der stack-trace. - Okay für den ersten Kommentar, ich werde es nicht nochmals tun. Was Ihre zweite Bemerkung : Was würden Sie tun? Ah ich bekomme, was du meinst, die die exception werfen sich selbst, damit er nicht von mir verlangen, es zu fangen und werfen es mich, richtig? Danke für die Kommentare.
- Ausnahmen propagieren selbst-ohne unsere Hilfe. Auch Ihr code wird es so Aussehen, wie die exception kam von der Lage des
throw
. - Sehr guter Punkt! Danke.
- Vielleicht eine dumme Frage, aber sind Sie sicher, dass das form-tag über den enctype? Html-Code.BeginForm("ProcessForm", "Home", null, FormMethod.Post, new { enctype = "multipart/form-data" })
- Ja: @using (Html.BeginForm("Bearbeiten", "Schuhe", FormMethod.Post, new { enctype = "multipart/form-data" }))
Du musst angemeldet sein, um einen Kommentar abzugeben.
Was ist Ihre Ansicht Modell? Zunächst ersetzen (Schuh Schuh, HttpPostedFileBase Bild) mit (FormCollection formCollection). Setzen Sie einen Haltepunkt, um zu sehen, dass Sie alle übermittelten Werte. Wenn Sie das tun, dann gibt es ein problem mit dem Modell binden und wir müssen Adresse.
Bearbeiten
Können Sie bitte einen Haltepunkt in
Fügen Sie eine Uhr mit dem Namen und Dateipfad Variablen. Ich denke, dass der server-Pfad ist nicht, was Sie erwarten, es zu sein, oder vielleicht sind Sie der Suche in den falschen Ordner alle zusammen. Sagen Sie uns, was sind die Werte dieser Variablen. Stellen Sie außerdem sicher, dass keine Ausnahme geworfen wird, wenn Sie vorbei gehen
image.SaveAs(filePath);
Ich schließlich doch einen workaround tut sehr gut. Ich fragte sogar meinen job und jeder sagte, es war nichts falsch an allen. Also Schraube es hier ist, was ich getan habe:
Statt .SaveAs() ich habe eine Methode, die :
Ich nenne es so:
... Und das ist es.
image.FileName
Pfad enthält Daten und wird durch ausgewählteProbieren Sie etwas wie:
Wie sind Sie mit der Einstellung Schuh.ImagePath? Ihr Problem fühlt sich wie Server.MapPath ist die Rückgabe ein Wert, den Sie nicht erwartet.
Haben Sie überprüft, um zu sehen, wenn Sie mehrere web-Server? Wie ein load balancer vielleicht. Könnte es nicht sein, eine Ausnahme zu werfen, weil es nicht wirklich eine Ausnahme, und die Datei tatsächlich vorhanden ist irgendwo, nur nicht auf dem server, der Sie glauben, dass es ist. Nur ein Gedanke (es ist mir schon passiert vor).
Stellen Sie sicher, dass Sie mit enctype="multipart/form-data" in form
http://www.prideparrot.com/blog/archive/2012/8/uploading_and_returning_files
Ich lief auch in die gleichen Problem auf diesem thread und nach ein paar versuchen des Hochladens einer Datei, die ich erfrischt den Ordner, wo die Dateien waren, angenommen zu werden, und schließlich sah ich Sie dort. Nicht sicher, warum es war nicht das erste mal, nach dem ersten refresh, aber es hat wahrscheinlich etwas zu tun mit dem aktualisieren der Ordner. Ich habe die refresh-aus innerhalb von Visual Studio und den hatte ich auch "Alle Dateien Anzeigen" - button auf.