Jak uzyskać formularz sieciowy ASP.net (v3.5), aby opublikować plik przy użyciu zwykłego starego <input type="file" />
?
Nie jestem zainteresowany użyciem formantu serwera ASP.net FileUpload.
asp.net
upload
file-upload
Ronnie Overby
źródło
źródło
runat="server"
, nie jest niezależny od serwera ASP.NETvar fileUploaded = document.getElementById("myFile").files[0];
a nawet możesz uzyskać bajty za pomocąreadAsArrayBuffer
: stackoverflow.com/questions/37134433/… - ale co zamierzasz zrobić z tymi wszystkimi bajtami po stronie klienta? OP chce całkowicie uniknąć komunikacji po stronie serwera, a nie sterowania ASP .NET. -1 do ciebie.Oto rozwiązanie bez polegania na jakiejkolwiek kontroli po stronie serwera, tak jak OP opisał w pytaniu.
Kod HTML po stronie klienta:
Metoda Page_Load pliku upload.aspx:
źródło
Request.Files[0]
zamiastRequest.Files["UploadedFile"]
i podczas gdy OP używał prostego ASP .NET, a nie MVC, jeśli ktoś chce użyć tego dla MVC, po prostu potrzebujeszHttpPostedFileBase
zamiastHttpPostedFile
.Będziesz musiał ustawić
enctype
atrybutform
tomultipart/form-data
; wtedy możesz uzyskać dostęp do przesłanego pliku za pomocąHttpRequest.Files
kolekcji.źródło
użyj kontrolki HTML z atrybutem serwera runat
Następnie w asp.net Codebehind
Istnieją również opcje imprezy trzeciej , które pokażą postęp, jeśli jesteś zainteresowany
źródło
<asp:FileUpload ID="fileUpload1" runat="server"></asp:FileUpload>
). To coś innego niż powiedzenie, aby nie umieszczać arunat=server
nainput
polu.HtmlInputFile
kontrolę.Tak, możesz to osiągnąć metodą postu Ajax. po stronie serwera możesz użyć httphandler. Dlatego nie używamy żadnych elementów sterujących serwera zgodnie z Twoimi wymaganiami.
dzięki Ajax możesz również pokazać postęp przesyłania.
będziesz musiał czytać plik jako strumień wejściowy.
Przykładowy kod
źródło
fs.close()
wszystko inne może skończyć się w nieczytelnych plikach, ponieważ pozostają one w jakiś sposób otwarte w usługach IIS.Kolekcja Request.Files zawiera wszystkie pliki przesłane wraz z formularzem, niezależnie od tego, czy pochodzą one z formantu FileUpload, czy z ręcznie zapisanego
<input type="file">
.Możesz więc po prostu napisać zwykły stary znacznik wejściowy pliku w środku swojego WebForm, a następnie odczytać plik przesłany z kolekcji Request.Files.
źródło
Ponieważ inni odpowiedzieli, Request.Files to HttpFileCollection, który zawiera wszystkie opublikowane pliki, wystarczy poprosić ten obiekt o plik w następujący sposób:
Ale co się stanie, gdy istnieje więcej niż jeden znacznik wejściowy o tej samej nazwie atrybutu:
Po stronie serwera poprzedni kod Request.Files ["myFile"] zwraca tylko jeden obiekt HttpPostedFile zamiast dwóch plików. Widziałem w .net 4.5 metodę rozszerzającą o nazwie GetMultiple, ale dla poprzednich wersji nie istnieje, w tym celu proponuję metodę rozszerzenia jako:
Ta metoda rozszerzenia zwróci wszystkie obiekty HttpPostedFile, które mają nazwę „myFiles” w HttpFileCollection, jeśli takie istnieją.
źródło
Kontrolka HtmlInputFile
Używałem tego cały czas.
źródło
runat="server"
co zasadniczo zmienia go w kontrolkę serwera, której nie chcieli używać.Oto artykuł Code Project z projektem do pobrania, który ma rozwiązać ten problem. Zastrzeżenie: nie testowałem tego kodu. http://www.codeproject.com/KB/aspnet/fileupload.aspx
źródło
źródło