Как я могу получить веб-форму ASP.net(v3.5) для публикации файла, используя простой старый <input type="file"/>
?
Я не заинтересован в использовании серверного элемента управления ASP.net FileUpload.
Как я могу получить веб-форму ASP.net(v3.5) для публикации файла, используя простой старый <input type="file"/>
?
Я не заинтересован в использовании серверного элемента управления ASP.net FileUpload.
В вашем aspx:
<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>
В коде позади:
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)));
}
}
Вот решение, не полагающееся на какой-либо серверный элемент управления, как описано в вопросе OP.
Код HTML на стороне клиента:
<form action="upload.aspx" method="post" enctype="multipart/form-data">
<input type="file" name="UploadedFile" />
</form>
Page_Load метод 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
}
}
Вам нужно установить атрибут enctype
form
на multipart/form-data
;
то вы можете получить доступ к загруженному файлу с помощью коллекции HttpRequest.Files
.
используйте элемент управления HTML с атрибутом сервера runat
<input id="FileInput" runat="server" type="file" />
Затем в asp.net Codebehind
FileInput.PostedFile.SaveAs("DestinationPath");
Есть также некоторые 3'rd party, которые будут показывать прогресс, если вы запросили
Да, вы можете добиться этого методом ajax post. на стороне сервера вы можете использовать httphandler. Поэтому мы не используем серверные элементы управления в соответствии с вашими требованиями.
с помощью ajax вы также можете показать ход загрузки.
вам нужно будет прочитать файл как входной поток.
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);
}
}
Пример кода
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();
}
}
}
}
Коллекция Request.Files содержит любые файлы, загруженные с вашей формой, независимо от того, пришли они из элемента управления FileUpload или вручную <input type="file">
.
Итак, вы можете просто написать простой старый тег ввода файла в середине вашего WebForm, а затем прочитать файл, загруженный из коллекции Request.Files.
Как и другие пользователи, Request.Files представляет собой HttpFileCollection, который содержит все файлы, которые были отправлены, вам нужно только спросить об этом объекте для этого файла:
Request.Files["myFile"]
Но что происходит, когда имеется более чем одна вводная надпись с тем же именем атрибута:
Select file 1 <input type="file" name="myFiles" />
Select file 2 <input type="file" name="myFiles" />
На стороне сервера предыдущий код Request.Files [ "myFile" ] возвращает только один объект HttpPostedFile вместо двух файлов. Я видел в .net 4.5 метод расширения, называемый GetMultiple, но для предыдущих версий он не существует, поскольку я предлагаю метод расширения как:
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);
}
}
}
Этот метод расширения возвращает все объекты HttpPostedFile, которые имеют имя "myFiles" в HttpFileCollection, если они существуют.
Я использовал это все время.
Вот статья проекта кода с загружаемым проектом, целью которого является решение этой проблемы. Отказ от ответственности: я не тестировал этот код. 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();