ASP.NET MVC에서 비동기 적으로 업로드 된 양식 파일을 유지하는 방법은 무엇입니까?

조엘 민

시나리오는 다음과 같습니다.

  1. ASP.NET MVC로 개발 된 웹 사이트가 있습니다. 웹 사이트에는 여러 파일 업로드 필드를 포함한 여러 입력 필드가 포함 된 양식이 있습니다.

  2. 내가하려는 것은 사용자가 파일을 선택하자마자 파일을 비동기 적 으로 업로드 하여 파일이 업로드 되는 동안 사용자가 다른 입력을 계속 채울 수 있도록하는 것입니다.

  3. 서버가 파일을 수신 확인한 후 사용자가 제출 버튼을 클릭하면 양식이 전송되고 업로드 된 파일과 함께 저장 됩니다 .

비동기 업로드를 처리 하는 별도의 컨트롤러 작업 이 필요하다고 가정 하지만 양식 제출 을 처리 하는 다른 작업 (동일한 컨트롤러 내) 에서 이러한 업로드 된 파일에 어떻게 액세스 할 수 있습니까?

양식이 제출 될 때까지 파일 임시로 저장 해야하는 경우 저장 하기에 바람직한 위치는 어디입니까?

사용자 3559349

양식을 선택할 때 이미 업로드 한 경우 양식을 제출할 때 파일을 업로드 할 필요가없는 것 같습니다 (그리고 enctype양식 요소에서 속성 을 제거하고 싶을 것입니다 .

기본 단계는 사용자가 ajax (사용 FormData) 로 파일을 선택했을 때 파일을 업로드하고 저장 한 다음 해당 파일의 경로를 반환하여 최종적으로 양식을 제출할 때 해당 정보도 게시 할 수 있도록하는 것입니다.

보기에 표시 / 편집하려는 항목을 나타내는보기 모델을 정의하여 시작하십시오.

public class FileAttachmentVM
{
    public string Path { get; set; }
    public string DisplayName { get; set; }
}
public class MyViewModel
{
    .... // properties to display/edit in the view
    public List<FileAttachmentVM> Files { get; set; }
}

그리고보기에서

@model MyViewModel
...
@using (Html.BeginForm())
{
    ....
    <div id="file-inputs"></div> // placeholder for the file collection hidden inputs
}
<div id="file-names"></div> // place holder for the collection of file already uploaded
<input type="file" id="file" />
<button type="button" id="upload">Upload</button>
// template for adding new inputs for the file collection
<div id="template" style="display:none">
    <div class="file-details">
        <input type="hidden" class="file-path" name="Files[#].Path" value="" />
        <input type="hidden" class="file-name" name="Files[#].DisplayName" value="" />
        <input type="text" name="Files.Index" value="#" />
    </div>
</div>

파일을 업로드하고 DOM을 업데이트하는 스크립트

var fileInputs = $('#file-inputs');
var fileNames = $('#file-names');

$('#Upload').click(function () {
    var file = $('#file').get(0).files[0];
    if (!file) {
        return;
    }
    var formData = new FormData();
    formData.append("file", file);
    $.ajax({
        url: '@Url.Action("Upload", "...")',// add controller name
        type: 'POST',
        data: formData,
        processData: false,
        contentType: false,
        success: function (data) {
            if (!data) {
                // Oops, something went wrong
                return;
            }
            $('#file').val(''); // clear file input
            // Add the display name
            fileNames.append($('<div></div>').text(data.DisplayName));
            // Add the inputs
            var index = (new Date()).getTime(); // unique indexer
            var clone = $('#template').clone(); // clone the template
            clone.html($(clone).html().replace(/#/g, index)); // update the indexer
            fileInputs.append(clone.html()); // append the inputs
            // update the input values
            var lastFile = fileInputs.find('.file-details').last();
            lastFile.find('.file-path').last().val(data.Path);
            lastFile.find('.file-name').last().val(data.DisplayName);
        }
    });
});

마지막으로 컨트롤러 방법

[HttpPost]
public JsonResult Upload(HttpPostedFileBase file)
{
    if (file != null && file.ContentLength > 0)
    {
        var displayName = Path.GetFileName(file.FileName);
        var fileExtension = Path.GetExtension(displayName);
        var fileName = string.Format("{0}{1}", Guid.NewGuid(), fileExtension);
        var path = Path.Combine(Server.MapPath("~/App_Data/Files"), fileName);
        file.SaveAs(path);
        return Json(new { DisplayName = displayName, Path = path });
    }
    return Json(null);
}

그런 다음 양식을 제출하는 컨트롤러 메서드에서

public ActionResult Create(MyViewModel model)
{
    // Initialize a data model, map the view model properties to it and save
    // Loop through model.Files and save each file display name and path to the database (along with the ID of the entity you created/updated

코드에 대한 몇 가지 참고 사항.

  1. 사용자가 파일을 선택하자마자 파일을 업로드하겠다고 표시했습니다 . IMO는 예상하지 못한 동작입니다. 사용자가 명시 적으로 확인한 다음 업로드 버튼을 클릭하도록 허용하는 것이 더 좋지만 버튼 .change()이벤트가 아닌 파일 입력 이벤트 를 처리하도록 스크립트를 수정할 수 .click()있습니다.
  2. 파일은 Guid고유한지 확인하기 위해 로 저장되며 다른 사용자가 동일한 이름의 파일을 업로드하는 경우 파일을 덮어 쓸 위험이 없습니다.
  3. 사용자가 일부 파일을 업로드했지만 편집을 중단하면 어떻게되는지 고려해야합니다. 예를 들어 파일을 임시 디렉토리에 저장하고 제출 방법 양식으로 영구 디렉토리로 이동 (및 주기적으로 중단 된 파일 제거) 할 수 있습니다.
  4. 사용자가 마음을 바꾼 경우 표시 이름 옆에 '삭제'링크를 포함 할 수도 있습니다 (해당 링크는 파일을 삭제하기 위해 ajax 메서드를 호출 함).

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

asp .net에 파일을 업로드하는 방법은 무엇입니까?

분류에서Dev

제출 후 Angular에서 양식을 비동기 적으로 검증하는 방법은 무엇입니까?

분류에서Dev

ASP.NET 처리기의 URL을 jquery 파일 업로드에 전달하는 방법은 무엇입니까?

분류에서Dev

Android에서 동적으로 생성 된 양식 값을 얻는 방법은 무엇입니까?

분류에서Dev

컴파일 된 Angular 파일을 라우팅에 동적으로로드하는 방법은 무엇입니까?

분류에서Dev

JSP를 사용하여 업로드 된 .csv 파일에서 양식 텍스트 필드를 자동 업데이트하는 방법은 무엇입니까?

분류에서Dev

Asp.net MVC-보내기 버튼을 누르지 않고 파일을 업로드하는 방법은 무엇입니까? 파일을 선택하면 자동으로 업로드됩니다.

분류에서Dev

Angular에서 [FromForm]으로 장식 된 ASP.NET Core Web API 작업에 양식의 데이터를 보내는 방법은 무엇입니까?

분류에서Dev

동적으로 생성 된 입력에서 양식 데이터를 POST하는 방법은 무엇입니까?

분류에서Dev

C #에서 양식을 동적으로 업데이트하는 방법은 무엇입니까?

분류에서Dev

HTML 파일에서 JSON 양식 객체를 동적으로 생성하는 방법은 무엇입니까?

분류에서Dev

MDI 자식 양식을 비동기 적으로 만드는 방법은 무엇입니까?

분류에서Dev

asp.net 웹 양식에서 데이터베이스 테이블의 행을 기반으로 텍스트 상자를 동적으로 만드는 방법은 무엇입니까?

분류에서Dev

OneDrive에서 동기화 된 파일을 자동으로 다운로드하는 방법은 무엇입니까?

분류에서Dev

ASP.NET Core에서 InstancePerLifetimeScope 종속성을 동적으로 해결하는 방법은 무엇입니까?

분류에서Dev

VB.NET에서 동적으로 생성 된 컨트롤을 관리하는 방법은 무엇입니까?

분류에서Dev

ASP.NET에서 동적으로 생성 된 사용자 정의 컨트롤에서 컨트롤을 찾는 방법은 무엇입니까?

분류에서Dev

동적으로 작성된 양식에서 데이터를 가져 오는 방법은 무엇입니까?

분류에서Dev

ASP.NET MVC에서 다른 cshtml 파일을 SelectPDF 헤더로 사용하는 방법은 무엇입니까?

분류에서Dev

ASP.NET에서 웹 양식의 값을 다른 양식으로 전달하는 방법은 무엇입니까?

분류에서Dev

양식에서 .NET Core API 컨트롤러에 2GB 이상의 큰 파일을 업로드하는 방법은 무엇입니까?

분류에서Dev

양식을 동적으로 만드는 방법은 무엇입니까?

분류에서Dev

Spring에서 양식 값으로 파일 업로드를 만드는 방법은 무엇입니까?

분류에서Dev

PHP에서 여러 수준의 탭과 모듈을 사용하여 동적으로 생성 된 양식을 제출하는 방법은 무엇입니까?

분류에서Dev

Netsuite 파일 캐비닛에 파일을 자동으로 업로드하는 방법은 무엇입니까?

분류에서Dev

React에서 양식 제출을 기반으로 useEffect를 적용하는 방법은 무엇입니까?

분류에서Dev

asp.net에서 레코드를 동적으로 표시하는 방법은 무엇입니까?

분류에서Dev

Flutter에서 양식 필드를 동적으로로드하는 가장 좋은 방법은 무엇입니까?

분류에서Dev

.Net Core 3 ASP.NET MVC에서 타사 로거를 사용하지 않고 파일에 기록하는 방법은 무엇입니까?

Related 관련 기사

  1. 1

    asp .net에 파일을 업로드하는 방법은 무엇입니까?

  2. 2

    제출 후 Angular에서 양식을 비동기 적으로 검증하는 방법은 무엇입니까?

  3. 3

    ASP.NET 처리기의 URL을 jquery 파일 업로드에 전달하는 방법은 무엇입니까?

  4. 4

    Android에서 동적으로 생성 된 양식 값을 얻는 방법은 무엇입니까?

  5. 5

    컴파일 된 Angular 파일을 라우팅에 동적으로로드하는 방법은 무엇입니까?

  6. 6

    JSP를 사용하여 업로드 된 .csv 파일에서 양식 텍스트 필드를 자동 업데이트하는 방법은 무엇입니까?

  7. 7

    Asp.net MVC-보내기 버튼을 누르지 않고 파일을 업로드하는 방법은 무엇입니까? 파일을 선택하면 자동으로 업로드됩니다.

  8. 8

    Angular에서 [FromForm]으로 장식 된 ASP.NET Core Web API 작업에 양식의 데이터를 보내는 방법은 무엇입니까?

  9. 9

    동적으로 생성 된 입력에서 양식 데이터를 POST하는 방법은 무엇입니까?

  10. 10

    C #에서 양식을 동적으로 업데이트하는 방법은 무엇입니까?

  11. 11

    HTML 파일에서 JSON 양식 객체를 동적으로 생성하는 방법은 무엇입니까?

  12. 12

    MDI 자식 양식을 비동기 적으로 만드는 방법은 무엇입니까?

  13. 13

    asp.net 웹 양식에서 데이터베이스 테이블의 행을 기반으로 텍스트 상자를 동적으로 만드는 방법은 무엇입니까?

  14. 14

    OneDrive에서 동기화 된 파일을 자동으로 다운로드하는 방법은 무엇입니까?

  15. 15

    ASP.NET Core에서 InstancePerLifetimeScope 종속성을 동적으로 해결하는 방법은 무엇입니까?

  16. 16

    VB.NET에서 동적으로 생성 된 컨트롤을 관리하는 방법은 무엇입니까?

  17. 17

    ASP.NET에서 동적으로 생성 된 사용자 정의 컨트롤에서 컨트롤을 찾는 방법은 무엇입니까?

  18. 18

    동적으로 작성된 양식에서 데이터를 가져 오는 방법은 무엇입니까?

  19. 19

    ASP.NET MVC에서 다른 cshtml 파일을 SelectPDF 헤더로 사용하는 방법은 무엇입니까?

  20. 20

    ASP.NET에서 웹 양식의 값을 다른 양식으로 전달하는 방법은 무엇입니까?

  21. 21

    양식에서 .NET Core API 컨트롤러에 2GB 이상의 큰 파일을 업로드하는 방법은 무엇입니까?

  22. 22

    양식을 동적으로 만드는 방법은 무엇입니까?

  23. 23

    Spring에서 양식 값으로 파일 업로드를 만드는 방법은 무엇입니까?

  24. 24

    PHP에서 여러 수준의 탭과 모듈을 사용하여 동적으로 생성 된 양식을 제출하는 방법은 무엇입니까?

  25. 25

    Netsuite 파일 캐비닛에 파일을 자동으로 업로드하는 방법은 무엇입니까?

  26. 26

    React에서 양식 제출을 기반으로 useEffect를 적용하는 방법은 무엇입니까?

  27. 27

    asp.net에서 레코드를 동적으로 표시하는 방법은 무엇입니까?

  28. 28

    Flutter에서 양식 필드를 동적으로로드하는 가장 좋은 방법은 무엇입니까?

  29. 29

    .Net Core 3 ASP.NET MVC에서 타사 로거를 사용하지 않고 파일에 기록하는 방법은 무엇입니까?

뜨겁다태그

보관