2009-02-20 21 views
89

Làm cách nào để có được biểu mẫu web ASP.net (v3.5) để đăng tệp bằng cách sử dụng một hình thức cũ <input type="file" />?Tải lên tệp trong ASP.net mà không cần sử dụng chức năng kiểm soát máy chủ FileUpload

Tôi không quan tâm đến việc sử dụng kiểm soát máy chủ Tải lên tệp ASP.net.

Cảm ơn đề xuất của bạn.

+17

Ahhh .... ngày newb của tôi ... :) –

+0

lmao @Ronnie Overby –

Trả lời

121

Trong aspx của bạn:

<form id="form1" runat="server" enctype="multipart/form-data"> 
<input type="file" id="myFile" name="myFile" /> 
<asp:Button runat="server" ID="btnUpload" OnClick="btnUploadClick" Text="Upload" /> 
</form> 

Trong mã sau:

protected void btnUploadClick(object sender, EventArgs e) 
{ 
    HttpPostedFile file = Request.Files["myFile"]; 

    //check file was submitted 
    if (file != null && file.ContentLength > 0) 
    { 
     string fname = Path.GetFileName(file.FileName); 
     file.SaveAs(Server.MapPath(Path.Combine("~/App_Data/", fname))); 
    } 
} 
+3

@mathieu, đáng tiếc là bạn sử dụng biến thể 'runat =" server "', nó không độc lập với máy chủ của ASP.NET – Secret

+0

nếu có nhiều hơn 1 đầu vào và bạn muốn các hàm riêng biệt được thực hiện với cả hai bộ các tập tin. –

+0

trong khi sử dụng nó để tải lên nhiều tệp, nó trả về cùng tên tệp cho tất cả các tệp và do đó lưu số tệp n đầu tiên. Bất kỳ ý tưởng làm thế nào để vượt qua nó? – sohaiby

2

HtmlInputFile control

Tôi đã sử dụng tất cả thời gian.

+1

Điều đó đòi hỏi thêm 'runat = "server" 'mà cần thiết phải biến nó thành một điều khiển máy chủ, mà họ không muốn để sử dụng. – ahwm

8

sử dụng điều khiển HTML với một thuộc tính máy chủ runat

<input id="FileInput" runat="server" type="file" /> 

Sau đó, trong asp.net codebehind

FileInput.PostedFile.SaveAs("DestinationPath"); 

Ngoài ra còn có một số 3'rd party tùy chọn mà sẽ hiển thị tiến bộ nếu bạn Intrested

+2

Một lần nữa, đó là biến nó thành một điều khiển máy chủ. ;) – ahwm

21

Bạn sẽ phải đặt thuộc tính enctype của form thành multipart/form-data; thì bạn có thể truy cập tệp đã tải lên bằng cách sử dụng bộ sưu tập HttpRequest.Files.

+0

Mẫu máy chủ của tôi ở trên trang chính và tôi không thể thêm nhiều phần/biểu mẫu dữ liệu (kể từ đó nó sẽ xuất hiện trên mọi trang). Cách giải quyết nhanh chóng và bẩn là thêm một điều khiển FileUpload ẩn vào trang. WebForms sau đó tự động thêm dữ liệu nhiều phần/biểu mẫu. Tôi đã phải làm điều này bởi vì tôi đã sử dụng một đầu vào tập tin với Angular2 và không thể sử dụng một điều khiển máy chủ trong một mẫu thành phần. – Jason

4

Bộ sưu tập Request.Files chứa bất kỳ tệp nào được tải lên cùng với biểu mẫu của bạn, bất kể chúng đến từ một điều khiển FileUpload hoặc viết bằng tay <input type="file">.

Vì vậy, bạn chỉ có thể viết một thẻ đầu vào tệp cũ đơn giản ở giữa WebForm của bạn và sau đó đọc tệp được tải lên từ bộ sưu tập Request.Files.

36

Dưới đây là một giải pháp mà không dựa vào bất kỳ kiểm soát server-side, giống như OP đã được mô tả trong câu hỏi.

Khách hàng bên HTML code:

<form action="upload.aspx" method="post" enctype="multipart/form-data"> 
    <input type="file" name="UploadedFile" /> 
</form> 

phương pháp Page_Load của upload.aspx:

if(Request.Files["UploadedFile"] != null) 
{ 
    HttpPostedFile MyFile = Request.Files["UploadedFile"]; 
    //Setting location to upload files 
    string TargetLocation = Server.MapPath("~/Files/"); 
    try 
    { 
     if (MyFile.ContentLength > 0) 
     { 
      //Determining file name. You can format it as you wish. 
      string FileName = MyFile.FileName; 
      //Determining file size. 
      int FileSize = MyFile.ContentLength; 
      //Creating a byte array corresponding to file size. 
      byte[] FileByteArray = new byte[FileSize]; 
      //Posted file is being pushed into byte array. 
      MyFile.InputStream.Read(FileByteArray, 0, FileSize); 
      //Uploading properly formatted file to server. 
      MyFile.SaveAs(TargetLocation + FileName); 
     } 
    } 
    catch(Exception BlueScreen) 
    { 
     //Handle errors 
    } 
} 
+0

Tuyệt, điều này cũng giải quyết được vấn đề của tôi! – Etienne

+0

Xem ra để gọi HTTPWebRequest gửi đường dẫn tệp đầy đủ trong MyFile.FileName. WebClient gọi chỉ cần gửi tên tập tin. HTTPWebRequest sẽ khiến MyFile.SaveAs thất bại. Chỉ cần lãng phí thời gian theo đuổi một khách hàng làm việc và một khách hàng không. –

6

Có bạn có thể đạt được điều này qua đường bưu điện ajax phương pháp. ở phía máy chủ, bạn có thể sử dụng httphandler. Vì vậy, chúng tôi không sử dụng bất kỳ điều khiển máy chủ nào theo yêu cầu của bạn.

với ajax, bạn cũng có thể hiển thị tiến trình tải lên.

bạn sẽ phải đọc tệp dưới dạng đầu vào.

using (FileStream fs = File.Create("D:\\_Workarea\\" + fileName)) 
    { 
     Byte[] buffer = new Byte[32 * 1024]; 
     int read = context.Request.GetBufferlessInputStream().Read(buffer, 0, buffer.Length); 
     while (read > 0) 
     { 
      fs.Write(buffer, 0, read); 
      read = context.Request.GetBufferlessInputStream().Read(buffer, 0, buffer.Length); 
     } 
    } 

Mẫu Mã

function sendFile(file) {    
     debugger; 
     $.ajax({ 
      url: 'handler/FileUploader.ashx?FileName=' + file.name, //server script to process data 
      type: 'POST', 
      xhr: function() { 
       myXhr = $.ajaxSettings.xhr(); 
       if (myXhr.upload) { 
        myXhr.upload.addEventListener('progress', progressHandlingFunction, false); 
       } 
       return myXhr; 
      }, 
      success: function (result) {      
       //On success if you want to perform some tasks. 
      }, 
      data: file, 
      cache: false, 
      contentType: false, 
      processData: false 
     }); 
     function progressHandlingFunction(e) { 
      if (e.lengthComputable) { 
       var s = parseInt((e.loaded/e.total) * 100); 
       $("#progress" + currFile).text(s + "%"); 
       $("#progbarWidth" + currFile).width(s + "%"); 
       if (s == 100) { 
        triggerNextFileUpload(); 
       } 
      } 
     } 
    } 
+0

Có lẽ bạn nên thêm gợi ý để thêm '' 'fs.close()' '' mọi thứ khác có thể kết thúc trong các tệp không thể đọc được vì chúng vẫn đang mở bằng cách nào đó trong IIS. – mistapink

3

Như những người khác có câu trả lời, các Request.Files là một HttpFileCollection có chứa tất cả các tập tin đã được đăng, bạn chỉ cần phải hỏi đối tượng đó cho các tập tin như thế này:

Request.Files["myFile"] 

Nhưng những gì xảy ra khi có nhiều hơn một đầu vào mark-up với tên thuộc tính giống nhau:

Select file 1 <input type="file" name="myFiles" /> 
Select file 2 <input type="file" name="myFiles" /> 

Ở phía máy chủ, mã trước Request.Files ["myFile"] chỉ trả lại một đối tượng HttpPostedFile thay vì hai tệp. Tôi đã thấy trên .net 4.5 là một phương pháp mở rộng gọi là GetMultiple nhưng đối với các phiên bản prevoious nó không tồn tại, cho rằng vấn đề tôi đề nghị phương pháp khuyến nông như:

public static IEnumerable<HttpPostedFile> GetMultiple(this HttpFileCollection pCollection, string pName) 
{ 
     for (int i = 0; i < pCollection.Count; i++) 
     { 
      if (pCollection.GetKey(i).Equals(pName)) 
      { 
       yield return pCollection.Get(i); 
      } 
     } 
} 

phương pháp Phần mở rộng này sẽ trả lại tất cả các đối tượng HttpPostedFile có tên "myFiles" trong HttpFileCollection nếu có.

0
//create a folder in server (~/Uploads) 
//to upload 
File.Copy(@"D:\CORREO.txt", Server.MapPath("~/Uploads/CORREO.txt")); 

//to download 
      Response.ContentType = ContentType; 
      Response.AppendHeader("Content-Disposition", "attachment;filename=" + Path.GetFileName("~/Uploads/CORREO.txt")); 
      Response.WriteFile("~/Uploads/CORREO.txt"); 
      Response.End(); 
+0

Sử dụng nút '{}' để định dạng bài đăng của bạn. Ngay bây giờ nó trông văn bản rác. – Raju

Các vấn đề liên quan