답변:
귀하의 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)));
}
}
var fileUploaded = document.getElementById("myFile").files[0];
당신은 심지어 사용하여 바이트 얻을 수 있습니다 readAsArrayBuffer
: stackoverflow.com/questions/37134433/...를 -하지만 당신은 그 클라이언트 측 바이트 모두와 함께 할 건가요? OP는 서버 측 통신이 아닌 ASP .NET 제어를 완전히 피하려고합니다. -1.
다음은 OP가 질문에서 설명한 것처럼 서버 측 제어에 의존하지 않는 솔루션입니다.
클라이언트 측 HTML 코드 :
<form action="upload.aspx" method="post" enctype="multipart/form-data">
<input type="file" name="UploadedFile" />
</form>
upload.aspx의 Page_Load 메서드 :
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]
대신에 Request.Files["UploadedFile"]
사람이 MVC이를 사용하고자하는 경우와 영업 이익은 직선 ASP .NET이 아닌 MVC를 사용하는 동안, 당신은 필요 HttpPostedFileBase
가 아닌 HttpPostedFile
.
당신은 설정해야 enctype
의 속성 form
에를 multipart/form-data
; 그런 다음 HttpRequest.Files
컬렉션을 사용하여 업로드 된 파일에 액세스 할 수 있습니다 .
runat 서버 속성과 함께 HTML 컨트롤 사용
<input id="FileInput" runat="server" type="file" />
그런 다음 asp.net Codebehind에서
FileInput.PostedFile.SaveAs("DestinationPath");
당신이 intrested 경우 진행 상황을 보여주는 몇 가지 타사 옵션도 있습니다
<asp:FileUpload ID="fileUpload1" runat="server"></asp:FileUpload>
) 을 피하고 싶었습니다 . runat=server
이것은 input
필드 에 넣지 말라는 것과는 다릅니다 .
HtmlInputFile
컨트롤을 포함합니다 .
예, 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();
}
}
}
}
fs.close()
IIS 내에서 열려 있기 때문에 읽을 수없는 파일이 될 수 있는 다른 모든 것을 추가하는 힌트를 추가해야 할 수도 있습니다.
다른 사람들이 대답했듯이 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);
}
}
}
이 확장 메서드는있는 경우 HttpFileCollection에 "myFiles"라는 이름을 가진 모든 HttpPostedFile 개체를 반환합니다.
이 문제를 해결하기 위해 다운로드 할 수있는 프로젝트가 포함 된 코드 프로젝트 기사가 있습니다. 면책 조항 :이 코드를 테스트하지 않았습니다. 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"
. 그것은 ASP.NET의 서버 물건과 독립적이지 않습니다