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의 텍스트를 볼 수 없습니다 ..

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

코드를 복사
    < 형태 에있어서 = "후" 에 enctype = "multipart / form-data"로 ASP 제어기 = "UploadFile로" ASP 액션 = "뒤에 FileSave" > 
        < DIV > 
            < DIV > 
                < P > 폼表单多个上传文件: </ P > 
                < 입력 유형 = "파일" 이름 = "파일" 여러 /> 
                < 입력 유형 = "제출" = "上传"  /> 
            </ DIV > 
        </ DIV > 
    </ 형태 >
코드를 복사

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

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

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

코드를 복사
 공공  비동기 작업 <IActionResult> 뒤에 FileSave (목록 <IFormFile> 파일)
        {
            var에 파일 = Request.Form.Files;
             크기 (=> F = files.Sum을 f.Length);
            문자열 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))
                    {
                        
                        AWAIT formFile.CopyToAsync (스트림);
                    }
                }
            }

            리턴 확인 ( 새로운 {카운트 = files.Count 크기});
        }
코드를 복사

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

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

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

다음 생성자 삽입 코드 :

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

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

이러한 방법으로, 우리는 앞으로 실행 한 후 컨트롤러의 준비를 완료하고, 업로드 파일 .. 다음과 같은 효과가 있습니다 :

사항 copyToAsync 방법의 IFormFile, 우리는이 파일을 넣을 수 있으며 저장 로컬 복사본이 될 수 아래로 흘러.

 

2. 아약스 업로드 파일

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

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

코드를 복사
< DIV > 
    < ID = "uploadForm" > 
        AJAX上传多文件: < 입력 타입 = "파일" 이름 = "파일" 다수 /> 
        < 입력 타입 = "버튼" = "上传" 의 onclick = "doUpload ()"  /> 
    </ 형성 > 
</ DIV >
코드를 복사

쓰기 JS 코드는있는 그대로 (우리가 FormData 업로드 객체를 사용 여기) 다음과 같습니다 :

코드를 복사
 함수 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 = files.Sum을 f.Length);
            문자열 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))
                    {
                        
                        AWAIT formFile.CopyToAsync (스트림);
                    }
                }
            }

            리턴 확인 ( 새로운 {카운트 = files.Count 크기});
 }
코드를 복사

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

 

3. webUploader 업로드 파일

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

바이 WebUploader 열린 제 2 패키지 업로드 컨트롤과 코드의 프론트 엔드를 (이 개 코드가 업로드된다) 간소화

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

.. 우리는 또한, 또는에서 직접 코드 뒤에를 수정할 필요가 없습니다 아래 캡슐화 .HTML과 JS JS 코드를 사용하려고 Request.Form.Files 에 인수 :

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


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

        $ ( "#upfliediv" ) .powerWebUpload ({
                자동 : 사실 , fileNumLimit : 1
            });
        $ ( "#upfliediv" ) .CleanUpload ();

    })
코드를 복사

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

 

파일을 다운로드하십시오.

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

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 Core中我们需要通过新的类FileExtensionContentTypeProvider来获取文件的ContentType

编写HTML+JS代码如下(PS:因为是demo,所以写的比较简陋):

<div>
    <input type="text" id="filename" /><button onclick="downLoad()">下载</button>
</div>
 function downLoad() {
            var filename = $("#filename").val();
            window.location.href = "Url.Action @ ("다운로드 ")? 파일 ="+ 파일 이름;

        }

효과는 같다 :

 

 

 

최근에 작성된

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

추천

출처www.cnblogs.com/lonelyxmas/p/12037660.html