[javascript] 파일을 비동기 적으로 업로드하려면 어떻게해야합니까?

jQuery와 함께 파일을 비동기 적으로 업로드하고 싶습니다.

$(document).ready(function () {
    $("#uploadbutton").click(function () {
        var filename = $("#file").val();

        $.ajax({
            type: "POST",
            url: "addFile.do",
            enctype: 'multipart/form-data',
            data: {
                file: filename
            },
            success: function () {
                alert("Data Uploaded: ");
            }
        });
    });
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.2.0/jquery.min.js"></script>
<span>File</span>
<input type="file" id="file" name="file" size="10"/>
<input id="uploadbutton" type="button" value="Upload"/>

파일을 업로드하는 대신 파일 이름 만 가져옵니다. 이 문제를 해결하려면 어떻게해야합니까?



답변

HTML5 를 사용하면 Ajax 및 jQuery로 파일을 업로드 할 수 있습니다. 뿐만 아니라 파일 유효성 검사 (이름, 크기 및 MIME 형식)를 수행하거나 HTML5 progress 태그 (또는 div)를 사용하여 progress 이벤트를 처리 할 수 ​​있습니다. 최근에 파일 업 로더를 만들어야했지만 Flash 나 Iframe 또는 플러그인 을 사용하고 싶지 않았으며 조사 후 해결책을 찾았습니다.

HTML :

<form enctype="multipart/form-data">
    <input name="file" type="file" />
    <input type="button" value="Upload" />
</form>
<progress></progress>

먼저 원하는 경우 유효성 검사를 수행 할 수 있습니다. 예를 들어 .on('change')파일이있는 경우 :

$(':file').on('change', function () {
  var file = this.files[0];

  if (file.size > 1024) {
    alert('max upload size is 1k');
  }

  // Also see .name, .type
});

이제 $.ajax()버튼을 클릭 하여 제출하십시오.

$(':button').on('click', function () {
  $.ajax({
    // Your server script to process the upload
    url: 'upload.php',
    type: 'POST',

    // Form data
    data: new FormData($('form')[0]),

    // Tell jQuery not to process data or worry about content-type
    // You *must* include these options!
    cache: false,
    contentType: false,
    processData: false,

    // Custom XMLHttpRequest
    xhr: function () {
      var myXhr = $.ajaxSettings.xhr();
      if (myXhr.upload) {
        // For handling the progress of the upload
        myXhr.upload.addEventListener('progress', function (e) {
          if (e.lengthComputable) {
            $('progress').attr({
              value: e.loaded,
              max: e.total,
            });
          }
        }, false);
      }
      return myXhr;
    }
  });
});

보다시피 HTML5 (및 일부 연구) 파일 업로드를 통해 파일 업로드가 가능할뿐만 아니라 매우 쉬워집니다. 예제의 일부 HTML5 구성 요소가 모든 브라우저에서 제공되는 것은 아니므로 Chrome 으로 사용해보십시오 .


답변

2019 업데이트 : 그것은 여전히 브라우저에 따라 당신의 인구 통계 학적 사용합니다.

“새로운”HTML5 fileAPI 로 이해해야 할 중요한 것은 IE 10까지 지원되지 않았다는 것 입니다. 특정 시장에서 이전 버전의 Windows에 대한 평균 이상의 경향이있는 경우 해당 시장에 액세스하지 못할 수 있습니다.

2017 년 현재 브라우저의 약 5 %는 IE 6, 7, 8 또는 9 중 하나입니다. 대기업으로 향하는 경우 (예 : B2B 도구 또는 교육을 위해 제공하는 것) 해당 수치가 급등 할 수 있습니다 . 2016 년에, 나는 기계의 60 % 이상에서 IE8을 사용하는 회사를 상대했습니다.

이 답변은 2019 년이며, 최초 답변 후 거의 11 년이 지났습니다. IE9 이하는 전 세계적 으로 1 % 정도이지만 여전히 높은 사용량의 클러스터가 있습니다.

피쳐가 -whatever이에서 중요한 멀리 걸릴, 어떤 브라우저를 확인 하여 사용자가 사용 . 그렇지 않은 경우 고객에게 제공 할 수있는 “나를 위해 일하기”가 충분하지 않은 이유에 대한 빠르고 고통스러운 교훈을 배우게됩니다. caniuse 는 유용한 도구이지만 인구 통계를 어디서 얻었는지 기록해 둡니다 . 그들은 당신과 일치하지 않을 수 있습니다. 이것은 기업 환경보다 결코 사실이 아닙니다.

2008 년의 나의 대답은 다음과 같습니다.


그러나 파일 업로드 방법에는 비 JS 방법이 있습니다. CSS로 숨기는 페이지에서 iframe을 만든 다음 해당 iframe에 게시 할 양식을 대상으로 지정할 수 있습니다. 메인 페이지는 이동할 필요가 없습니다.

“실제”게시물이므로 대화식이 아닙니다. 상태가 필요한 경우 처리 할 서버 측이 필요합니다. 서버에 따라 크게 다릅니다. ASP.NET 에는 더 좋은 메커니즘이 있습니다. PHP plain은 실패하지만 Perl 또는 Apache 수정을 사용하여 해결할 수 있습니다 .

여러 파일 업로드가 필요한 경우 최대 파일 업로드 한도를 극복하기 위해 한 번에 하나씩 각 파일을 수행하는 것이 가장 좋습니다. 첫 번째 양식을 iframe에 게시하고 위를 사용하여 진행 상황을 모니터링하고 완료되면 두 번째 양식을 iframe에 게시하는 등의 작업을 수행합니다.

또는 Java / Flash 솔루션을 사용하십시오. 그들은 게시물로 할 수있는 일에 훨씬 더 유연합니다 …


답변

이 목적으로 Fine Uploader 플러그인을 사용하는 것이 좋습니다 . 귀하의 JavaScript코드는 다음과 같습니다

$(document).ready(function() {
  $("#uploadbutton").jsupload({
    action: "addFile.do",
    onComplete: function(response){
      alert( "server response: " + response);
    }
  });
});


답변

참고 :이 답변은 구식이므로 이제 XHR을 사용하여 파일을 업로드 할 수 있습니다.


XMLHttpRequest (Ajax)를 사용하여 파일을 업로드 할 수 없습니다 . iframe 또는 Flash를 사용하여 효과를 시뮬레이션 할 수 있습니다. 효과를 얻기 위해 iframe을 통해 파일을 게시 하는 우수한 jQuery Form Plugin .


답변

미래 독자를위한 준비.

비동기 파일 업로드

HTML5로

FormDataFile API 가 지원되는 경우 (HTML5 기능 모두) 메소드를 사용하여 jQuery로 파일 업로드 할 수 있습니다 .$.ajax()

FormData없이 파일 보낼 수도 있지만 XMLHttpRequest (Ajax) 로 보낼 수있는 방식으로 파일을 처리하기 위해 File API가 있어야합니다 .

$.ajax({
  url: 'file/destination.html', 
  type: 'POST',
  data: new FormData($('#formWithFiles')[0]), // The form with the file inputs.
  processData: false,
  contentType: false                    // Using FormData, no need to process data.
}).done(function(){
  console.log("Success: Files sent!");
}).fail(function(){
  console.log("An error occurred, the files couldn't be sent!");
});

빠르고 순수한 JavaScript ( jQuery 없음 ) 예제는 ” FormData 객체를 사용하여 파일 보내기 “를 참조하십시오 .

폴백

HTML5가 지원되지 않는 경우 ( File API 는 아님 ) 유일한 다른 순수 JavaScript 솔루션 ( Flash 또는 기타 브라우저 플러그인은 없음)은 숨겨진 iframe 기술로 XMLHttpRequest 객체 를 사용하지 않고 비동기식 요청을 에뮬레이션 할 수 있습니다 .

파일 입력을 사용하여 iframe을 양식의 대상으로 설정합니다. 사용자가 요청을 제출하면 파일이 업로드되지만 기본 페이지를 다시 렌더링하는 대신 iframe 내부에 응답이 표시됩니다. iframe을 숨기면 전체 프로세스가 사용자에게 투명 해지고 비동기 요청을 에뮬레이트합니다.

제대로 완료되면 거의 모든 브라우저에서 작동하지만 iframe에서 응답을 얻는 방법에는 몇 가지주의 사항이 있습니다.

이 경우 같은 래퍼 플러그인을 사용하는 것이 좋습니다 비프로스트 용도 iframe이 기술을 뿐만 아니라 제공 jQuery를 아약스 수송 할 수 있도록 파일을 보낼 단지와 $.ajax()같은 방법 :

$.ajax({
  url: 'file/destination.html', 
  type: 'POST',
  // Set the transport to use (iframe means to use Bifröst)
  // and the expected data type (json in this case).
  dataType: 'iframe json',                                
  fileInputs: $('input[type="file"]'),  // The file inputs containing the files to send.
  data: { msg: 'Some extra data you might need.'}
}).done(function(){
  console.log("Success: Files sent!");
}).fail(function(){
  console.log("An error occurred, the files couldn't be sent!");
});

플러그인

Bifröst 는 jQuery의 ajax 메소드에 폴백 지원을 추가하는 작은 래퍼이지만 jQuery Form Plugin 또는 jQuery File Upload 와 같은 많은 플러그인 에는 HTML5에서 다른 폴백까지의 전체 스택과 프로세스를 용이하게하는 유용한 기능이 포함되어 있습니다. 요구 사항과 요구 사항에 따라 간단한 구현 또는이 플러그인 중 하나를 고려할 수 있습니다.


답변

AJAX 파일 업로드 jQuery 플러그인 은 파일을 일부 업로드하고 응답을 콜백에 전달합니다.

  • 특정 HTML에 의존하지 않고 그냥 <input type="file">
  • 서버가 특정 방식으로 응답하지 않아도됩니다.
  • 사용하는 파일 수 또는 페이지의 위치는 중요하지 않습니다.

-최소한으로 사용하십시오-

$('#one-specific-file').ajaxfileupload({
  'action': '/upload.php'
});

-또는만큼-

$('input[type="file"]').ajaxfileupload({
  'action': '/upload.php',
  'params': {
    'extra': 'info'
  },
  'onComplete': function(response) {
    console.log('custom handler for file:');
    alert(JSON.stringify(response));
  },
  'onStart': function() {
    if(weWantedTo) return false; // cancels upload
  },
  'onCancel': function() {
    console.log('no file selected');
  }
});


답변

아래 스크립트를 사용하여 정상적으로 작동하는 이미지를 업로드했습니다.

HTML

<input id="file" type="file" name="file"/>
<div id="response"></div>

자바 스크립트

jQuery('document').ready(function(){
    var input = document.getElementById("file");
    var formdata = false;
    if (window.FormData) {
        formdata = new FormData();
    }
    input.addEventListener("change", function (evt) {
        var i = 0, len = this.files.length, img, reader, file;

        for ( ; i < len; i++ ) {
            file = this.files[i];

            if (!!file.type.match(/image.*/)) {
                if ( window.FileReader ) {
                    reader = new FileReader();
                    reader.onloadend = function (e) {
                        //showUploadedItem(e.target.result, file.fileName);
                    };
                    reader.readAsDataURL(file);
                }

                if (formdata) {
                    formdata.append("image", file);
                    formdata.append("extra",'extra-data');
                }

                if (formdata) {
                    jQuery('div#response').html('<br /><img src="ajax-loader.gif"/>');

                    jQuery.ajax({
                        url: "upload.php",
                        type: "POST",
                        data: formdata,
                        processData: false,
                        contentType: false,
                        success: function (res) {
                         jQuery('div#response').html("Successfully uploaded");
                        }
                    });
                }
            }
            else
            {
                alert('Not a vaild image!');
            }
        }

    }, false);
});

설명

응답 div을 사용 하여 업로드 애니메이션 및 업로드 완료 후 응답 을 표시합니다.

이 스크립트를 사용할 때 ID와 같은 추가 데이터를 파일과 함께 보낼 수 있습니다. extra-data스크립트에서와 같이 언급했습니다 .

PHP 수준에서는 정상적인 파일 업로드로 작동합니다. 추가 데이터는 데이터로 검색 할 수 있습니다 $_POST.

여기서는 플러그인과 물건을 사용하지 않습니다. 원하는대로 코드를 변경할 수 있습니다. 당신은 여기서 맹목적으로 코딩하지 않습니다. 이것은 모든 jQuery 파일 업로드의 핵심 기능입니다. 실제로 자바 스크립트.