[예약] ASP.NET 코어 파일 업로드 및 다운로드 (다양한 방법을 업로드)

ASP.NET 코어 파일 업로드 및 다운로드 (다양한 방법을 업로드)

 
머리말

몇 시간 전이 프로젝트는 온라인, 너무 바빠서, 최근의 연구 조사는 마침내 ASP.NET 코어를 시작할 수 있습니다.

시리즈를 작성하는 것,하지만 난 디렉토리를 파악하지 않은, 오늘은 그 뒤에 마무리, 첫 번째는-온다.

현재까지 ASP.NET 코어 2.0은 매우 성숙하고있다. 그것의 사용에 대한 다음 프로젝트.

 

본문

1. 모델 바인딩 업로드 파일 (공식 예)를 사용하여

기계 번역의 공식 주소 : HTTPS : //docs.microsoft.com/en-us/aspnet/core/mvc/models/file-uploads

여기 Tucao에 대한 - - 그것은 TM 기계 번역 ..가 아니라 E의 텍스트를보고 자신의 등 ..

처음에 우리는 다음과 같은 형태의 양식을 작성해야합니다 :

코드를 복사
    <form 방식 = "후"에 enctype = "multipart / form-data"로 ASP 제어기 = "UploadFile로"ASP 액션 = "뒤에 FileSave"> 
        <div> 
            <div> 
                <p> 양식表单多个上传文件</ P > 
                <입력 유형 = "파일"이름 = "파일"여러 /> 
                <입력 유형 = "제출"값 = "上传"/> 
            </ div> 
        </ div> 
    </ FORM>
코드를 복사

어떤, ASP-컨트롤러ASP 액션이, (이 말하기 후, TagHelper 놀이입니다) 컨트롤러와 우리가 액세스 할 방법입니다.

우리의 입력 태그 플러스 여러 속성을 부여 여러 파일 업로드를 지원합니다.

컨트롤러를 작성, 우리는 다음과 같이 업로드 방법은 쓰기 :

코드를 복사
작업 <IActionResult> 뒤에 FileSave (목록 <IFormFile> 파일) 비동기 공공 
        { 
            var에 파일 =의 Request.Form.Files; 
            (=> f.Length F) 롱 사이즈 = files.Sum; 
            문자열 webRootPath = _hostingEnvironment.WebRootPath; 
            문자열 contentRootPath = _hostingEnvironment.ContentRootPath; 
            foreach는 (파일의 var에 내고 formfile) 
            { 
                경우 (formFile.Length> 0) 
                { 

                    문자열 fileExt = GetFileExt (formFile.FileName); "."//文件扩展名,不含
                    긴 이는 파일 크기 = formFile.Length; //获得文件大小,以字节为单位 
                    문자열 NEWFILENAME = System.Guid.NewGuid의 toString () ( ) + + fileExt. "."; // 무작위로 새 파일 이름을 생성
                    VAR적인 filePath = webRootPath + "/ 업로드 /"+ NEWFILENAME;
                    사용 (VAR 스트림 = 새로운하여 FileStream (여기서 filePath, FileMode.Create)) 
                    { 
                        
                        formFile.CopyToAsync (스트림)을 기다리고; 
                    } 
                } 
            } 

            확인 (COUNT = {새로운 files.Count 크기})를 호출; 
        }
코드를 복사

여기서 우리는 새로운 인터페이스 Asp.NET 코어 IFormFile을 사용하여 다음과 같이 IFormFile 정의된다 :

코드를 복사
공용 인터페이스의 IFormFile 
{ 
    문자열의 ContentType은 {얻을; } 
    문자열의 ContentDisposition {얻을; } 
    IHeaderDictionary 헤더 {얻을; } 
    긴 길이 {얻을; } 
    문자열 이름 {얻을; } 
    문자열 파일 이름 {얻을; } 
    스트림 OpenReadStream (); 
    보이드하는 CopyTo (스트림 표적); 
    작업 사항 copyToAsync (스트림 대상, CancellationToken cancellationToken = NULL); 
}
코드를 복사

위의 코드는 프로젝트의 루트 디렉토리의 주소를 얻기 위해 IHostingEnvironment를 사용합니다.

다음 생성자 삽입 코드 :

코드를 복사
        개인 읽기 전용 IHostingEnvironment _hostingEnvironment; 

        공개 UpLoadFileController (IHostingEnvironment hostingEnvironment) 
        { 
            _hostingEnvironment = hostingEnvironment; 
        }
코드를 복사

다음과 같은 효과가 있습니다 .. 이런 식으로, 우리는 컨트롤러의 준비를 완료 한 후 파일을 업로드, 전면에 실행

사항 copyToAsync 방법의 IFormFile, 우리는이 파일을 넣고 로컬 복사본이 될 수 아래로 흐름을 저장할 수 있습니다.

 

2. 아약스 업로드 파일

우리가 업로드 양식을하지만, 프로젝트의 과정을 사용하는 위의 대부분의 경우는 업로드 Ajax를 사용합니다, 그래서 우리는 업로드 Ajax를 사용하는 방법에 대해 뭔가를 말할 수있다.

다음과 같이 먼저 쓰기 HTML 코드는 다음과 같습니다

코드를 복사
<div> 
    <form ID = "uploadForm"> 
        AJAX上传多文件<입력 TYPE = "파일"NAME = "파일"다중 /> 
        <input 타입 = "버튼"값 = "上传"의 onclick = "doUpload ()" /> 
    </ FORM> 
</ div>
코드를 복사

(우리가 FormData 업로드 객체를 사용하여 여기에) 다음과 같이 JS 코드는 쓰기 :

코드를 복사
doUpload 함수 () { 
        VAR formData = 새로운 FormData ($ ( "#의 uploadForm") [0]); 
        $ 아약스 ({ 
            URL : '@의 Url.Action ( "뒤에 FileSave")', 
            유형 : 'POST', 
            데이터 : formData, 
            비동기 : 거짓, 
            캐시 : 거짓 
            거짓 : contentType이 
            processData : 거짓, 
            성공 : 기능 (returndata ) { 
                경고 (returndata) 
            } 
            오류 : 함수 (returndata) { 
                경고 (returndata); 
            } 
        }); 
        }
코드를 복사

변경하지 않고 배경 코드입니다. 우리는 직접 찾을 수 <IFormFile> 파일 목록 파일을 얻을 수 없습니다.

시운전, 우리는하지만,에, 파일이 업로드되는 것을 볼 수 있습니다 Request.Form.Files 그들.

다음과 같이 배경 그래서 코드를 수정 :

코드를 복사
작업 비동기 공공 <IActionResult> 뒤에 FileSave () 
{ 
            var에 날짜 = 요청; 
            VAR 파일 = Request.Form.Files; 
            (=> f.Length F) 롱 사이즈 = files.Sum; 
            문자열 webRootPath = _hostingEnvironment.WebRootPath; 
            문자열 contentRootPath = _hostingEnvironment.ContentRootPath; 
            foreach는 (파일의 var에 내고 formfile) 
            { 
                경우 (formFile.Length> 0) 
                { 

                    문자열 fileExt = GetFileExt (formFile.FileName); //文件扩展名,不含"."  
                    오래 이는 파일 크기 = formFile.Length; // 바이트, 파일 크기를 얻을
                    문자열 NEWFILENAME = System.Guid.NewGuid (). ToString () + "." fileExt +; //随机生成新的文件名 
                    VAR적인 filePath = webRootPath + "/ 업로드 /"+ NEWFILENAME; 
                    사용 (VAR 스트림 = 새로운하여 FileStream (여기서 filePath, FileMode.Create)) 
                    { 
                        
                        formFile.CopyToAsync (스트림)을 기다리고; 
                    } 
                } 
            } 

            확인 (COUNT = {새로운 files.Count 크기})를 호출; 
 }
코드를 복사

에서 직접합니다 Request.Form.Files 파일의 수집을 얻는다. ~

 

3. webUploader 업로드 파일

.. .. 어 오래 전에 나는 JS webUploader의 패키지는 다음했다 :

바이 WebUploader (이 개 코드가 업로드 취득) 제 2 패키지 업로드 컨트롤을 열고 코드의 프론트 엔드를 간소화

바이 WebUploader 제 2 패키지, 프런트 엔드 코드 미리보기 이미지 업로드의 간소화 (이 개 코드가 업로드된다)

.. 우리는 또한 직접 뒤에 코드를 수정하거나, 필요, 아래 캡슐화 .HTML과 JS JS 코드를 사용하지 않을하려고 Request.Form.Files 에 인수 :

<div ID = "upfliediv"> </ div>
코드를 복사
$ (함수 () { 


        // 파일 업로드 인스턴스화 

        $ ( "#의 upfliediv") powerWebUpload을 ({. 
                Auto (자동) : true로, fileNumLimit :. 1 
            }) 
        . $ ( "#의 upfliediv") CleanUpload (); 

    })
코드를 복사

업로드 효과가 표시됩니다 :

 

4. 파일을 다운로드합니다.

파일을 업로드, 우리는 확실히 다운로드해야합니다.

URL의 + 주소를 통해 직접 다운로드는 매우 안전하지 않은 방식이다. 여기에 반환 다운로드 흐름의 우리가 양식에 있습니다.

배경 코드를 다음과 같이 :

 

코드를 복사
        /// <summary>
        /// 文件流的方式输出        /// </summary>
        /// <returns></returns>
        public IActionResult DownLoad(string file)
        {
            var addrUrl = file;
            var stream = System.IO.File.OpenRead(addrUrl);
            string fileExt = GetFileExt(file);
            //获取文件的ContentType
            var provider = new FileExtensionContentTypeProvider();
            var memi = provider.Mappings[fileExt];
            return File(stream, memi, Path.GetFileName(addrUrl));
        }  
코드를 복사

这里值得注意的是,以前我们想获取ContentType直接使用MimeMapping.GetMimeMapping(file);就好了.

但是这个类是在System.Web下的,core已经抛弃了现有的System.Web.

그래서 ASP.NET 코어, 우리는 새로운 클래스가 필요 FileExtensionContentTypeProvider을 ContentType이 파일을 얻을 수

다음 HTML + JS 코드는 물품 (PS : 그것은 데모이기 때문에, 쓸 데 비교적 간단하다) :

<div> 
    <input 타입 = "텍스트"ID = "이름"/> <버튼의 onclick = "다운로드 ()">下载</ 버튼> 
</ div>
기능 다운로드 () { 
            . VAR 파일 이름 = $ ( "# 파일 이름") 발 (); 
            window.location.href = "@의 Url.Action ("다운로드 ") + 파일 이름? = 파일"을; 

        }

효과는 같다 :

 

 

 

최근에 작성된

이 여기에,이 ~ 감사합니다.., 이상 블로그도 추가 문서의 범주 ASP.NET 핵심 관심, 제발 추종자 또는 추천하고, 나중에 ASP.NET 코어 기사에 안쪽에 분류됩니다.

저자 : 구 인도 출처 : HTTP : //www.cnblogs.com/GuZhenYin/ 당신이 도움이 기사를 읽고 생각하는 경우, "추천"버튼을 클릭하시기 바랍니다 "추천"나의 가장 큰 쓰기 전력이 될 것이다! 이 문서에서는, 저자 및 블로그 공원 전체에 속하는 다시 인쇄에 오신 것을 환영합니다,하지만이 부분에 의해 선언 된 저자의 동의없이 유지되어야하며, 기사 페이지에서

HTTPS : //www.cnblogs.com/SpiritWalker/p/8195653.html 재현

추천

출처blog.csdn.net/weixin_33775572/article/details/94228050