Làm cách nào tôi có thể lấy biểu mẫu web ASP.net (v3.5) để đăng tệp bằng cách sử dụng mẫu cũ <input type="file" />
?
Tôi không quan tâm đến việc sử dụng điều khiển máy chủ ASP.net FileUpload.
Làm cách nào tôi có thể lấy biểu mẫu web ASP.net (v3.5) để đăng tệp bằng cách sử dụng mẫu cũ <input type="file" />
?
Tôi không quan tâm đến việc sử dụng điều khiển máy chủ ASP.net FileUpload.
Câu trả lời:
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ã phía 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)));
}
}
var fileUploaded = document.getElementById("myFile").files[0];
và bạn thậm chí có thể lấy các byte bằng cách sử dụng readAsArrayBuffer
: stackoverflow.com/questions/37134433/… - nhưng bạn sẽ làm gì với tất cả các byte phía máy khách đó? OP muốn tránh hoàn toàn giao tiếp phía máy chủ không điều khiển ASP .NET. -1 cho bạn.
Đây là một giải pháp mà không cần dựa vào bất kỳ điều khiển phía máy chủ nào, giống như OP đã mô tả trong câu hỏi.
Mã HTML phía máy khách:
<form action="upload.aspx" method="post" enctype="multipart/form-data">
<input type="file" name="UploadedFile" />
</form>
Phương thức 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
}
}
Request.Files[0]
thay vì Request.Files["UploadedFile"]
và trong khi OP đang sử dụng ASP .NET thẳng chứ không phải MVC, nếu ai muốn sử dụng điều này cho MVC, bạn chỉ cần HttpPostedFileBase
thay thế HttpPostedFile
.
Bạn sẽ phải đặt enctype
thuộc tính của form
thành multipart/form-data
; thì bạn có thể truy cập tệp đã tải lên bằng HttpRequest.Files
bộ sưu tập.
sử dụng điều khiển HTML với 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ố tùy chọn bên thứ 3 sẽ hiển thị tiến trình nếu bạn vướng vào
<asp:FileUpload ID="fileUpload1" runat="server"></asp:FileUpload>
) Đó là khác nhau hơn là nói để không đặt một runat=server
trên một input
lĩnh vực.
HtmlInputFile
kiểm soát.
Có, bạn có thể đạt được điều này bằng phương pháp ajax post. về 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 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ã mẫu
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();
}
}
}
}
fs.close()
mọi thứ khác có thể kết thúc trong các tệp không đọc được vì chúng vẫn mở bằng cách nào đó trong IIS.
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ừ điều khiển FileUpload hay được viết thủ công <input type="file">
.
Vì vậy, bạn chỉ có thể viết một thẻ đầu vào tệp cũ thuần túy ở giữa WebForm của mình, sau đó đọc tệp được tải lên từ bộ sưu tập Request.Files.
Như những người khác đã trả lời, Request.Files là một HttpFileCollection chứa tất cả các tệp đã được đăng, bạn chỉ cần yêu cầu đối tượng đó cho tệp như sau:
Request.Files["myFile"]
Nhưng điều gì sẽ xảy ra khi có nhiều đánh dấu đầu vào có cùng tên thuộc tính:
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ả về một đối tượng HttpPostedFile thay vì hai tệp. Tôi đã thấy trên .net 4.5 một phương thức mở rộng được gọi là GetMultiple nhưng đối với các phiên bản thịnh hành thì nó không tồn tại, vì vấn đề đó, tôi đề xuất phương thức mở rộng là:
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 thức mở rộng này sẽ trả về tất cả các đối tượng HttpPostedFile có tên "myFiles" trong HttpFileCollection nếu có.
Tôi đã sử dụng cái này mọi lúc.
runat="server"
mà về cơ bản biến nó thành một điều khiển máy chủ mà họ không muốn sử dụng.
Đây là một bài viết về Dự án mã với một dự án có thể tải xuống nhằm mục đích giải quyết vấn đề này. Tuyên bố từ chối trách nhiệm: Tôi chưa thử nghiệm mã này. http://www.codeproject.com/KB/aspnet/fileupload.aspx
//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();
runat="server"
, nó không phải là độc lập với những thứ server của ASP.NET