(Przedmowa: to pytanie dotyczy ASP.NET MVC 3.0, która została wydana w 2011 roku , nie dotyczy ASP.NET Core 3.0, która została wydana w 2019 roku)
Chcę przesłać plik do asp.net mvc. Jak mogę przesłać plik za pomocą input file
kontroli HTML ?
c#
asp.net-mvc
asp.net-mvc-3
użytkownik637197
źródło
źródło
Odpowiedzi:
Nie używasz kontroli wprowadzania pliku. Kontrolki po stronie serwera nie są używane w ASP.NET MVC. Zapoznaj się z poniższym postem na blogu, który ilustruje, jak to osiągnąć w programie ASP.NET MVC.
Rozpocznij od utworzenia formularza HTML zawierającego dane wejściowe pliku:
a następnie masz kontroler do obsługi przesyłania:
źródło
<httpRuntime maxRequestLength="x" />
w pliku web.config, gdzie x jest liczbą KB dozwoloną do przesłania.Html.BeginForm(null, null, FormMethod.Post, new { enctype = "multipart/form-data" })
. Jest to przydatne, jeśli jest to widok częściowy, który jest wywoływany z wielu widoków nadrzędnych (lub podobnych).przesłać do
byte[]
(np. w celu zapisania do DB):Aby przenieść strumień wejściowy bezpośrednio do bazy danych, bez przechowywania go w pamięci, możesz użyć tej klasy pobranej stąd i nieco zmienionej:
i wykorzystanie:
źródło
using (MemoryStream ms = new MemoryStream()) { /* ... */ }
File.ReadAllBytes
Alternatywna metoda przeniesienia do bajtu [] (w celu zapisania do DB).
Metoda Arthura działa całkiem dobrze, ale nie kopiuje się idealnie, więc dokumenty MS Office mogą się nie otwierać po pobraniu ich z bazy danych. MemoryStream.GetBuffer () może zwrócić dodatkowe puste bajty na końcu bajtu [], ale można to naprawić za pomocą MemoryStream.ToArray (). Jednak znalazłem tę alternatywę, która działa idealnie dla wszystkich typów plików:
Oto mój pełny kod:
Klasa dokumentu:
Pobieranie pliku:
Udostępnianie pliku:
Widok (fragment):
źródło
Często chcesz przekazać także model viewmodel, a nie jedyny plik. W poniższym kodzie znajdziesz kilka innych przydatnych funkcji:
Można to zrobić za pomocą następującego kodu:
Upewnij się że masz
Twoim zdaniem pod kątem błędów sprawdzania poprawności.
Należy również pamiętać, że domyślna maksymalna długość żądania wynosi 4 MB (maxRequestLength = 4096), aby przesyłać większe pliki, należy zmienić ten parametr w pliku web.config:
(40960 = 40 MB tutaj).
Limit czasu wykonania to całkowita liczba sekund. Możesz to zmienić, aby umożliwić przesyłanie dużych plików.
źródło
W widoku:
podczas gdy następujący kod w kontrolerze:
źródło
Muszę przesłać plik w 100 kb fragmentach pliku i ostatni z magazynu plików do przesłania w bazie danych za pomocą polecenia. Mam nadzieję, że ci to pomoże.
JavaScript (Knockout Js)
Kod HTML:
źródło
To, co robię, jest prawie takie, jak powyżej, pokazuję ci mój kod i jak go używać z MYSSQL DB ...
Tabela dokumentów w DB -
int Id (PK), ciąg Url, opis ciągu, CreatedBy, TenancyId DateUploaded
Powyższy identyfikator kodu, będący kluczem podstawowym, URL to nazwa pliku (z typem pliku na końcu), opis pliku do wypisania w widoku dokumentów, utworzony przez osobę, która przesłała plik, tenancyId, data przesłany
wewnątrz widoku musisz zdefiniować typ, aby nie działał poprawnie.
Powyższy kod da ci przycisk przeglądania, a następnie w moim projekcie mam klasę o nazwie IsValidImage, która po prostu sprawdza, czy rozmiar pliku jest poniżej określonego maksymalnego rozmiaru, sprawdza, czy jest to plik IMG, to wszystko w funkcji bool klasy. Więc jeśli prawda zwraca prawdę.
Więc w kontrolerze:
źródło
źródło
Daje kompletne rozwiązanie
Pierwsze użycie wejścia w. CShtml w widoku MVC
Teraz zadzwoń do Ajax
Kontroler Json Call
źródło
Daję ci prostą i łatwą metodę zrozumienia i nauki.
Najpierw musisz napisać następujący kod w pliku .Cshtml .
następnie w kontrolerze wstaw następujący kod:
W tym celu musisz utworzyć warstwę BAL i DAL zgodnie z bazą danych.
źródło
Oto mój przykład działania:
źródło
proszę zwrócić uwagę na ten kod tylko do przesłania obrazu . Używam HTMLHelper do przesyłania obrazu. w pliku cshtml umieść ten kod
następnie utwórz znacznik HTMLHelper do przesyłania
i na koniec w akcji Prześlij swój plik
źródło
źródło
przesyłanie pliku przy użyciu formdata
plik .cshtml
Kod po stronie serwera
źródło
Prosty sposób na zapisanie wielu plików
cshtml
Kontroler
źródło
Ponieważ znalazłem problem z przesyłaniem pliku w przeglądarce IE, radzę sobie z tym poradzić w ten sposób.
Widok
Kontroler
źródło
HTML:
Kod za:
źródło
Sprawdź moje rozwiązanie
dodaj te funkcje do swojego,
base controller
aby móc z nich korzystaćall controllers
sprawdź, jak go używać
a oto pełny przykład
źródło
W kontrolerze
Z uwagi
W klasie modalnej
Utwórz folder podczas przesyłania w folderze Content w projekcie
źródło
Większość odpowiedzi wydaje się wystarczająca, chociaż zrobiłem dla ciebie przykładowy projekt na donnetfiddle
Używam LumenWorks.Framework do pracy CSV, ale nie musi to mieć.
Próbny
Widok
Kontroler:
źródło
Napotkałem ten sam błąd podczas tworzenia koncepcji przesyłania plików. Znam wiele odpowiedzi udzielonych przez programistów na to pytanie.
Pomimo tego, że odpowiadam na to pytanie, mam ten błąd przez nieuwzględniony błąd, o którym mowa poniżej.
Podając atrybut name, upewnij się, że parametr kontrolera ma również tę samą wartość nazwy „uploadedFile”. Lubię to :
w przeciwnym razie nie zostanie zmapowany.
źródło