jQuery Ajax 파일 업로드


755

다음 jQuery 코드를 사용하여 ajax 요청의 POST 메소드를 사용하여 파일 업로드를 수행 할 수 있습니까?

$.ajax({
    type: "POST",
    timeout: 50000,
    url: url,
    data: dataString,
    success: function (data) {
        alert('success');
        return false;
    }
});

가능하다면 data부품 을 채워야 합니까? 올바른 방법입니까? 파일을 서버 측에만 게시합니다.

나는 인터넷 검색을 해왔지만 계획에서 플러그인을 사용하고 싶지 않다는 것을 알았습니다. 적어도 지금은


아약스 대신 iframe을 사용해야합니다, 파일 업로드를 지원하지 않습니다
antyrat


답변:


596

AJAX를 통한 파일 업로드는 불가능 합니다.
을 사용하여 페이지를 새로 고치지 않고도 파일을 업로드 할 수 있습니다 IFrame.
자세한 내용은 여기를 참조 하십시오 .


최신 정보

XHR2에서는 AJAX를 통한 파일 업로드가 지원됩니다. 예를 들어 FormData객체를 통해 유감스럽게도 모든 브라우저에서 지원되지는 않습니다.

FormData 지원은 다음 데스크탑 브라우저 버전에서 시작됩니다.

  • IE 10 이상
  • Firefox 4.0 이상
  • 크롬 7 이상
  • 사파리 5+
  • 오페라 12+

자세한 내용은 MDN 링크를 참조하십시오 .


41
지원되지 않는 특정 브라우저 목록은 다음과 같습니다. caniuse.com/#search=FormData 또한 이것을 테스트하지는 않았지만 여기에는 FormData에 대한 폴리 필이 있습니다. gist.github.com/3120320
Ryan White

152
특히 IE <10은 링크를 읽기에는 너무 게으른 사람들에게는 적합하지 않습니다.
케빈

22
@Synexis 아니오 우리는 모든 IE가 22 %의 세계 시장 점유율과 27 %의 미국 시장을 가지고 있고 빠르게 떨어지기 때문에 더 이상 기다릴 필요가 없습니다. 70 세 이상의 사람들 일 가능성이 있습니다. 따라서 개발자가 IE를 어떻게해야하는지 지시하는 IE는 IE를 구성하거나 경쟁에서 벗어나야합니다.
Drew Calder

30
@DrewCalder 대부분의 IE 사용자는 회사 정책으로 인해 어떤 브라우저를 사용할지 선택할 수없는 회사원입니다. 나는 나이가 그것과 관련이 있다고 생각하지 않습니다. 70 세 이상의 사람들이 크롬이나 FF를 대신 설치하도록 자손을 얻는 것
같아요

3
이 링크는 실제로 최소한의 이해에 도움이되었습니다. xhr 요청을 사용할 필요가 없었습니다. 당신이 사용 아약스 메이크업을 할 경우 확인을 설정 enctype"form/multipart"!
Luminous

316

더 이상 ajax를 통해 파일을 업로드하는 데 iframe이 필요하지 않습니다. 나는 최근에 혼자서 해냈습니다. 이 페이지를 확인하십시오.

AJAX 및 jQuery와 함께 HTML5 파일 업로드 사용

http://dev.w3.org/2006/webapi/FileAPI/#FileReader-interface

답변을 업데이트하고 정리했습니다. getSize 함수를 사용하여 크기를 확인하거나 getType 함수를 사용하여 유형을 확인하십시오. 진행률 표시 줄 HTML 및 CSS 코드가 추가되었습니다.

var Upload = function (file) {
    this.file = file;
};

Upload.prototype.getType = function() {
    return this.file.type;
};
Upload.prototype.getSize = function() {
    return this.file.size;
};
Upload.prototype.getName = function() {
    return this.file.name;
};
Upload.prototype.doUpload = function () {
    var that = this;
    var formData = new FormData();

    // add assoc key values, this will be posts values
    formData.append("file", this.file, this.getName());
    formData.append("upload_file", true);

    $.ajax({
        type: "POST",
        url: "script",
        xhr: function () {
            var myXhr = $.ajaxSettings.xhr();
            if (myXhr.upload) {
                myXhr.upload.addEventListener('progress', that.progressHandling, false);
            }
            return myXhr;
        },
        success: function (data) {
            // your callback here
        },
        error: function (error) {
            // handle error
        },
        async: true,
        data: formData,
        cache: false,
        contentType: false,
        processData: false,
        timeout: 60000
    });
};

Upload.prototype.progressHandling = function (event) {
    var percent = 0;
    var position = event.loaded || event.position;
    var total = event.total;
    var progress_bar_id = "#progress-wrp";
    if (event.lengthComputable) {
        percent = Math.ceil(position / total * 100);
    }
    // update progressbars classes so it fits your code
    $(progress_bar_id + " .progress-bar").css("width", +percent + "%");
    $(progress_bar_id + " .status").text(percent + "%");
};

업로드 클래스를 사용하는 방법

//Change id to your id
$("#ingredient_file").on("change", function (e) {
    var file = $(this)[0].files[0];
    var upload = new Upload(file);

    // maby check size or type here with upload.getSize() and upload.getType()

    // execute upload
    upload.doUpload();
});

진행률 표시 줄 HTML 코드

<div id="progress-wrp">
    <div class="progress-bar"></div>
    <div class="status">0%</div>
</div>

진행률 표시 줄 CSS 코드

#progress-wrp {
  border: 1px solid #0099CC;
  padding: 1px;
  position: relative;
  height: 30px;
  border-radius: 3px;
  margin: 10px;
  text-align: left;
  background: #fff;
  box-shadow: inset 1px 3px 6px rgba(0, 0, 0, 0.12);
}

#progress-wrp .progress-bar {
  height: 100%;
  border-radius: 3px;
  background-color: #f39ac7;
  width: 0;
  box-shadow: inset 1px 1px 10px rgba(0, 0, 0, 0.11);
}

#progress-wrp .status {
  top: 3px;
  left: 50%;
  position: absolute;
  display: inline-block;
  color: #000000;
}

3
코드를 바로 복사하여 사용할 수 있습니다. 일부 id 이름과 클래스 이름을 변경하십시오. 모든 사용자 정의는 자신의 것입니다.
Ziinloader 2016 년

4
myXhr은 이름, 크기 및 유형뿐만 아니라 전역적인 것으로 보입니다. 또한 "xhr"을 사용하여 객체를 만든 다음 변경하는 대신 "beforeSend"를 사용하여 이미 생성 된 XMLHttpRequest 객체를 보강하는 것이 좋습니다.
awatts

8
@Ziinloader와 같이 사용할 수 있다고 생각하지 않습니다. 포함되지 않은 로컬 방법을 사용하고 있습니다 : writer(catchFile). 무엇입니까 writer()?
tandrewnichols

4
데이터에 업로드 할 파일과 함께 몇 개의 필드가 포함되어 있으면 어떻게됩니까?
raju

2
@Ziinloader 이것은 당신이 여러 번 돌아와서 유지 한 것을 볼 수있는 매우 유용한 예입니다. 내가 줄 수있는 공짜보다 훨씬 더 가치있는 답이 있습니다.
Regular Joe

190

Ajax 게시 및 업로드 파일이 가능합니다. jQuery $.ajax파일을로드 하는 기능을 사용하고 있습니다. XHR 객체를 사용하려고 시도했지만 PHP로 서버 측에서 결과를 얻을 수 없습니다.

var formData = new FormData();
formData.append('file', $('#file')[0].files[0]);

$.ajax({
       url : 'upload.php',
       type : 'POST',
       data : formData,
       processData: false,  // tell jQuery not to process the data
       contentType: false,  // tell jQuery not to set contentType
       success : function(data) {
           console.log(data);
           alert(data);
       }
});

보시다시피 비어 있거나 $('#yourForm').serialize())기존 (직렬화 된?- 기존 양식) 의 FormData 객체를 만든 다음 입력 파일을 첨부해야합니다.

여기에 대한 자세한 내용은 다음과 같습니다 - jQuery.ajax와 FormData를 사용하여 파일을 업로드하는 방법 - jQuery를 통해 업로드 파일을 객체 FormData가 제공되며, 파일 이름, GET 요청

PHP 프로세스의 경우 다음과 같은 것을 사용할 수 있습니다.

//print_r($_FILES);
$fileName = $_FILES['file']['name'];
$fileType = $_FILES['file']['type'];
$fileError = $_FILES['file']['error'];
$fileContent = file_get_contents($_FILES['file']['tmp_name']);

if($fileError == UPLOAD_ERR_OK){
   //Processes your file here
}else{
   switch($fileError){
     case UPLOAD_ERR_INI_SIZE:   
          $message = 'Error al intentar subir un archivo que excede el tamaño permitido.';
          break;
     case UPLOAD_ERR_FORM_SIZE:  
          $message = 'Error al intentar subir un archivo que excede el tamaño permitido.';
          break;
     case UPLOAD_ERR_PARTIAL:    
          $message = 'Error: no terminó la acción de subir el archivo.';
          break;
     case UPLOAD_ERR_NO_FILE:    
          $message = 'Error: ningún archivo fue subido.';
          break;
     case UPLOAD_ERR_NO_TMP_DIR: 
          $message = 'Error: servidor no configurado para carga de archivos.';
          break;
     case UPLOAD_ERR_CANT_WRITE: 
          $message= 'Error: posible falla al grabar el archivo.';
          break;
     case  UPLOAD_ERR_EXTENSION: 
          $message = 'Error: carga de archivo no completada.';
          break;
     default: $message = 'Error: carga de archivo no completada.';
              break;
    }
      echo json_encode(array(
               'error' => true,
               'message' => $message
            ));
}

2
이 코드를 실행하려면 어떤 jquery 라이브러리를 참조해야합니까?
Rayden Black

답은 2014 년에 작성되었습니다. JQuery 버전은 1.10입니다. 최신 버전으로는 시도하지 않았습니다.
pedrozopayares

5
formData.append('file', $('#file')[0].files[0]);반환 undefinedconsole.log(formData) 제외하고는 아무 상관이 없다_proto_
Yakob Ubaidi

1
IE 9에서는 지원하지 않습니다. 일부가 I와 같은 지옥에 갇힌 경우
CountMurphy

3
이 작업을 수행했습니다 ... 핀치, jQuery Ajax 파일 업로드 천국에 있습니다! var formData = new FormData(); formData.append('file', document.getElementById('file').files[0]); $.ajax({ url : $("form[name='uploadPhoto']").attr("action"), type : 'POST', data : formData, processData: false, // tell jQuery not to process the data contentType: false, // tell jQuery not to set contentType success : function(data) { console.log(data); alert(data); } });
TARKUS

104

간단한 업로드 양식

 <script>
   //form Submit
   $("form").submit(function(evt){	 
      evt.preventDefault();
      var formData = new FormData($(this)[0]);
   $.ajax({
       url: 'fileUpload',
       type: 'POST',
       data: formData,
       async: false,
       cache: false,
       contentType: false,
       enctype: 'multipart/form-data',
       processData: false,
       success: function (response) {
         alert(response);
       }
   });
   return false;
 });
</script>
<!--Upload Form-->
<form>
  <table>
    <tr>
      <td colspan="2">File Upload</td>
    </tr>
    <tr>
      <th>Select File </th>
      <td><input id="csv" name="csv" type="file" /></td>
    </tr>
    <tr>
      <td colspan="2">
        <input type="submit" value="submit"/> 
      </td>
    </tr>
  </table>
</form>


이 예제에서 사용 된 js는 무엇입니까?이 하나의 특정 jquery 플러그인이 있습니다. 링크 stackoverflow.com/questions/28644200/…
브라운 만 리바이벌

19
$ (이)가 [0] 입니다
machineaddict

2
게시 된 파일에 대한 서버의 매개 변수는 무엇입니까? 서버 부분을 게시 할 수 있습니까?
FrenkyB

@FrenkyB 및 기타-서버의 파일 (PHP)은 $ _POST 변수에 저장되지 않으며 $ _FILES 변수에 저장됩니다. 이 경우 "csv"는 입력 태그의 이름 속성이므로 $ _FILES [ "csv"]를 사용하여 액세스 할 수 있습니다.
dev_masta

68

나는 이것에 꽤 늦었지만 아약스 기반 이미지 업로드 솔루션을 찾고 있었고 내가 찾고있는 대답은이 게시물 전체에 흩어져 있습니다. 내가 해결 한 솔루션은 FormData 객체와 관련이 있습니다. 내가 작성한 코드의 기본 형태를 조립했습니다. fd.append ()를 사용하여 양식에 사용자 정의 필드를 추가하는 방법과 ajax 요청이 완료 될 때 응답 데이터를 처리하는 방법을 보여줍니다.

html 업로드 :

<!DOCTYPE html>
<html>
<head>
    <title>Image Upload Form</title>
    <script src="//code.jquery.com/jquery-1.9.1.js"></script>
    <script type="text/javascript">
        function submitForm() {
            console.log("submit event");
            var fd = new FormData(document.getElementById("fileinfo"));
            fd.append("label", "WEBUPLOAD");
            $.ajax({
              url: "upload.php",
              type: "POST",
              data: fd,
              processData: false,  // tell jQuery not to process the data
              contentType: false   // tell jQuery not to set contentType
            }).done(function( data ) {
                console.log("PHP Output:");
                console.log( data );
            });
            return false;
        }
    </script>
</head>

<body>
    <form method="post" id="fileinfo" name="fileinfo" onsubmit="return submitForm();">
        <label>Select a file:</label><br>
        <input type="file" name="file" required />
        <input type="submit" value="Upload" />
    </form>
    <div id="output"></div>
</body>
</html>

PHP로 작업하는 경우 위의 HTML에 표시된 두 가지 사용자 정의 필드를 모두 포함하는 업로드를 처리하는 방법이 있습니다.

Upload.php

<?php
if ($_POST["label"]) {
    $label = $_POST["label"];
}
$allowedExts = array("gif", "jpeg", "jpg", "png");
$temp = explode(".", $_FILES["file"]["name"]);
$extension = end($temp);
if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/jpg")
|| ($_FILES["file"]["type"] == "image/pjpeg")
|| ($_FILES["file"]["type"] == "image/x-png")
|| ($_FILES["file"]["type"] == "image/png"))
&& ($_FILES["file"]["size"] < 200000)
&& in_array($extension, $allowedExts)) {
    if ($_FILES["file"]["error"] > 0) {
        echo "Return Code: " . $_FILES["file"]["error"] . "<br>";
    } else {
        $filename = $label.$_FILES["file"]["name"];
        echo "Upload: " . $_FILES["file"]["name"] . "<br>";
        echo "Type: " . $_FILES["file"]["type"] . "<br>";
        echo "Size: " . ($_FILES["file"]["size"] / 1024) . " kB<br>";
        echo "Temp file: " . $_FILES["file"]["tmp_name"] . "<br>";

        if (file_exists("uploads/" . $filename)) {
            echo $filename . " already exists. ";
        } else {
            move_uploaded_file($_FILES["file"]["tmp_name"],
            "uploads/" . $filename);
            echo "Stored in: " . "uploads/" . $filename;
        }
    }
} else {
    echo "Invalid file";
}
?>

나는 Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-extension, https,이것이 왜 그렇게 얻고 있는지 그래서 나는 당신의 코드를 그대로 붙여 넣습니다
Brownman Revival

2
@HogRider-오류 메시지가 Google 인 경우 이것이 첫 번째 결과입니다. stackoverflow.com/questions/10752055/…file:// 웹 서버를 사용하지 않고 로컬을 통해 웹 페이지에 액세스 하고 있습니까? 따로, 코드를 먼저 이해하지 않고 맹목적으로 코드를 복사하여 붙여 넣는 것이 가장 좋은 방법은 아닙니다. 코드를 사용하기 전에 진행 상황을 이해하려면 코드를 한 줄씩 살펴 보는 것이 좋습니다.
colincameron

@ colincameron 나는 그것을 통해 한 줄씩 겪은 몇 가지 사항을 분명히 해 주셔서 감사합니다. 정말 많이 이해하지 못하므로 누군가가 내 의심을 명확히 할 수 있도록 질문을했습니다. 정확한 xampp 방식으로 로컬을 사용하고 있습니다. 내가 분명히 할 수있는 질문을해도 될까요?
브라운 만 리바이벌 1

@Brownman Revival : 답글이 너무 늦다는 것을 알고 있습니다. HTML 파일을 서버에서 실행하는 것보다 파일로 열었으므로 교차 출처 오류가 발생했습니다.
Adarsh ​​Mohan

@ AdarshMohan 나는 회신을 appreaciate 내가 당신이 그것을 올바르게 만들기 위해 어떻게 제안합니까?
브라운 만 리바이벌

31

로 AJAX 업로드가 가능합니다 XMLHttpRequest(). iframe이 필요하지 않습니다. 업로드 진행률을 표시 할 수 있습니다.

자세한 내용은 https://stackoverflow.com/a/4943774/873282참조 하여 jQuery 업로드 진행률 및 AJAX 파일 업로드 에 질문 하십시오 .


24
불행히도 IE <10은 이것을 지원하지 않습니다.
사샤 체디 고프

1
다른 페이지를 답으로 언급하고 싶을 때는 투표로 닫거나 질문 아래에 의견을 남기십시오. 이 게시물은 답변이 아닙니다. 이런 종류의 게시물은 담당자를 농담하려는 것처럼 보입니다.
mickmackusa

18

이 작업을 수행하는 방법은 다음과 같습니다.

HTML

<input type="file" id="file">
<button id='process-file-button'>Process</button>

JS

$('#process-file-button').on('click', function (e) {
    let files = new FormData(), // you can consider this as 'data bag'
        url = 'yourUrl';

    files.append('fileName', $('#file')[0].files[0]); // append selected file to the bag named 'file'

    $.ajax({
        type: 'post',
        url: url,
        processData: false,
        contentType: false,
        data: files,
        success: function (response) {
            console.log(response);
        },
        error: function (err) {
            console.log(err);
        }
    });
});

PHP

if (isset($_FILES) && !empty($_FILES)) {
    $file = $_FILES['fileName'];
    $name = $file['name'];
    $path = $file['tmp_name'];


    // process your file

}

2
이것에 대해 나를 위해 가장 도움이 된 것은 $('#file')[0].files[0]적절한 요구 사항이없는 이상한 JS 해결 방법입니다.<form>
ffgpga08

이것은 완전한 솔루션이며 PHP 비트도 도움이됩니다.
cdsaenz

14

그런 식으로하고 싶다면 :

$.upload( form.action, new FormData( myForm))
.progress( function( progressEvent, upload) {
    if( progressEvent.lengthComputable) {
        var percent = Math.round( progressEvent.loaded * 100 / progressEvent.total) + '%';
        if( upload) {
            console.log( percent + ' uploaded');
        } else {
            console.log( percent + ' downloaded');
        }
    }
})
.done( function() {
    console.log( 'Finished upload');                    
});

...보다

https://github.com/lgersman/jquery.orangevolt-ampere/blob/master/src/jquery.upload.js

당신의 해결책 일 수 있습니다.


위의 링크는 $ 객체의 업로드 방법 어디 존재하지 않는입니다
coolesting


2
답변을 게시 해 주셔서 감사합니다! 자체 프로모션에 대한 FAQ를 주의 깊게 읽으십시오 . 또한 자신의 사이트 / 제품에 연결할 때마다 고지 사항을 게시 해야 합니다.
Andrew Barber

13
  • 숨겨진 iframe을 사용하고 양식의 대상을 해당 iframe의 이름으로 설정하십시오. 이렇게하면 양식을 제출할 때 iframe 만 새로 고쳐집니다.
  • 응답을 구문 분석하기 위해 iframe의로드 이벤트에 이벤트 핸들러를 등록하십시오.

: 내 블로그 게시물에 대한 자세한 내용 http://blog.manki.in/2011/08/ajax-fie-upload.html .


피가 가능한 IFRAMES
Bhargav Nanekalva에게

@BhargavNanekalva 당신의 관심사는 무엇입니까?
aswzen

13
$("#submit_car").click( function() {
  var formData = new FormData($('#car_cost_form')[0]);
$.ajax({
       url: 'car_costs.php',
       data: formData,
       async: false,
       contentType: false,
       processData: false,
       cache: false,
       type: 'POST',
       success: function(data)
       {
       },
     })    return false;    
});

편집 : contentype 및 프로세스 데이터 참고 Ajax를 통해 파일을 업로드하는 데 간단히 사용할 수 있습니다 ... 제출 입력은 양식 요소 외부에있을 수 없습니다 :)


3
이 방법을 사용하면 '파일'유형 필드가 아닌 양식을 게시 할 수 있습니다. 이 질문은 특히 파일 업로드에 관한 것입니다.
Jomy John

11

2019 년 업데이트 :

html

<form class="fr" method='POST' enctype="multipart/form-data"> {% csrf_token %}
<textarea name='text'>
<input name='example_image'>
<button type="submit">
</form>

js

$(document).on('submit', '.fr', function(){

    $.ajax({ 
        type: 'post', 
        url: url, <--- you insert proper URL path to call your views.py function here.
        enctype: 'multipart/form-data',
        processData: false,
        contentType: false,
        data: new FormData(this) ,
        success: function(data) {
             console.log(data);
        }
        });
        return false;

    });

views.py

form = ThisForm(request.POST, request.FILES)

if form.is_valid():
    text = form.cleaned_data.get("text")
    example_image = request.FILES['example_image']

1
이것은 이미 주어진 답변을 어떻게 개선합니까? 또한이 답변은 Django이며 views와 관련이없는 views.py 파일을 언급합니다.
dirkgroten

6
Django를 사용하는 동안 문제가 비슷하게 나타나고 Django를 사용하는 경우 문제를 해결하는 데 많은 지시가 없습니다. 나는 미래에 내가 한 것처럼 누군가가 여기에 도착할 경우를 대비하여 사전에 도움을 줄 것이라고 생각했습니다. 힘든 하루를 보내고 있습니까?
Jay

9

FormData를 사용하십시오. 정말 잘 작동합니다 :-) ...

var jform = new FormData();
jform.append('user',$('#user').val());
jform.append('image',$('#image').get(0).files[0]); // Here's the important bit

$.ajax({
    url: '/your-form-processing-page-url-here',
    type: 'POST',
    data: jform,
    dataType: 'json',
    mimeType: 'multipart/form-data', // this too
    contentType: false,
    cache: false,
    processData: false,
    success: function(data, status, jqXHR){
        alert('Hooray! All is well.');
        console.log(data);
        console.log(status);
        console.log(jqXHR);

    },
    error: function(jqXHR,status,error){
        // Hopefully we should never reach here
        console.log(jqXHR);
        console.log(status);
        console.log(error);
    }
});

이것은 무엇인가 : ( 'user', $ ( '# user'). val ());
rahim.nagori

id = "user"가있는 textbox는 @ rahim.nagori
Alp Altunel

7

Ajax를 통해 미리보기에서 원하지 않는 파일을 제거한 후 즉시 미리보기 및 업로드로 여러 파일 선택을 구현했습니다.

자세한 문서는 여기에서 찾을 수 있습니다 : http://anasthecoder.blogspot.ae/2014/12/multi-file-select-preview-without.html

데모 : http://jsfiddle.net/anas/6v8Kz/7/embedded/result/

jsFiddle : http://jsfiddle.net/anas/6v8Kz/7/

자바 스크립트 :

    $(document).ready(function(){
    $('form').submit(function(ev){
        $('.overlay').show();
        $(window).scrollTop(0);
        return upload_images_selected(ev, ev.target);
    })
})
function add_new_file_uploader(addBtn) {
    var currentRow = $(addBtn).parent().parent();
    var newRow = $(currentRow).clone();
    $(newRow).find('.previewImage, .imagePreviewTable').hide();
    $(newRow).find('.removeButton').show();
    $(newRow).find('table.imagePreviewTable').find('tr').remove();
    $(newRow).find('input.multipleImageFileInput').val('');
    $(addBtn).parent().parent().parent().append(newRow);
}

function remove_file_uploader(removeBtn) {
    $(removeBtn).parent().parent().remove();
}

function show_image_preview(file_selector) {
    //files selected using current file selector
    var files = file_selector.files;
    //Container of image previews
    var imageContainer = $(file_selector).next('table.imagePreviewTable');
    //Number of images selected
    var number_of_images = files.length;
    //Build image preview row
    var imagePreviewRow = $('<tr class="imagePreviewRow_0"><td valign=top style="width: 510px;"></td>' +
        '<td valign=top><input type="button" value="X" title="Remove Image" class="removeImageButton" imageIndex="0" onclick="remove_selected_image(this)" /></td>' +
        '</tr> ');
    //Add image preview row
    $(imageContainer).html(imagePreviewRow);
    if (number_of_images > 1) {
        for (var i =1; i<number_of_images; i++) {
            /**
             *Generate class name of the respective image container appending index of selected images, 
             *sothat we can match images selected and the one which is previewed
             */
            var newImagePreviewRow = $(imagePreviewRow).clone().removeClass('imagePreviewRow_0').addClass('imagePreviewRow_'+i);
            $(newImagePreviewRow).find('input[type="button"]').attr('imageIndex', i);
            $(imageContainer).append(newImagePreviewRow);
        }
    }
    for (var i = 0; i < files.length; i++) {
        var file = files[i];
        /**
         * Allow only images
         */
        var imageType = /image.*/;
        if (!file.type.match(imageType)) {
          continue;
        }

        /**
         * Create an image dom object dynamically
         */
        var img = document.createElement("img");

        /**
         * Get preview area of the image
         */
        var preview = $(imageContainer).find('tr.imagePreviewRow_'+i).find('td:first');

        /**
         * Append preview of selected image to the corresponding container
         */
        preview.append(img); 

        /**
         * Set style of appended preview(Can be done via css also)
         */
        preview.find('img').addClass('previewImage').css({'max-width': '500px', 'max-height': '500px'});

        /**
         * Initialize file reader
         */
        var reader = new FileReader();
        /**
         * Onload event of file reader assign target image to the preview
         */
        reader.onload = (function(aImg) { return function(e) { aImg.src = e.target.result; }; })(img);
        /**
         * Initiate read
         */
        reader.readAsDataURL(file);
    }
    /**
     * Show preview
     */
    $(imageContainer).show();
}

function remove_selected_image(close_button)
{
    /**
     * Remove this image from preview
     */
    var imageIndex = $(close_button).attr('imageindex');
    $(close_button).parents('.imagePreviewRow_' + imageIndex).remove();
}

function upload_images_selected(event, formObj)
{
    event.preventDefault();
    //Get number of images
    var imageCount = $('.previewImage').length;
    //Get all multi select inputs
    var fileInputs = document.querySelectorAll('.multipleImageFileInput');
    //Url where the image is to be uploaded
    var url= "/upload-directory/";
    //Get number of inputs
    var number_of_inputs = $(fileInputs).length; 
    var inputCount = 0;

    //Iterate through each file selector input
    $(fileInputs).each(function(index, input){

        fileList = input.files;
        // Create a new FormData object.
        var formData = new FormData();
        //Extra parameters can be added to the form data object
        formData.append('bulk_upload', '1');
        formData.append('username', $('input[name="username"]').val());
        //Iterate throug each images selected by each file selector and find if the image is present in the preview
        for (var i = 0; i < fileList.length; i++) {
            if ($(input).next('.imagePreviewTable').find('.imagePreviewRow_'+i).length != 0) {
                var file = fileList[i];
                // Check the file type.
                if (!file.type.match('image.*')) {
                    continue;
                }
                // Add the file to the request.
                formData.append('image_uploader_multiple[' +(inputCount++)+ ']', file, file.name);
            }
        }
        // Set up the request.
        var xhr = new XMLHttpRequest();
        xhr.open('POST', url, true);
        xhr.onload = function () {
            if (xhr.status === 200) {
                var jsonResponse = JSON.parse(xhr.responseText);
                if (jsonResponse.status == 1) {
                    $(jsonResponse.file_info).each(function(){
                        //Iterate through response and find data corresponding to each file uploaded
                        var uploaded_file_name = this.original;
                        var saved_file_name = this.target;
                        var file_name_input = '<input type="hidden" class="image_name" name="image_names[]" value="' +saved_file_name+ '" />';
                        file_info_container.append(file_name_input);

                        imageCount--;
                    })
                    //Decrement count of inputs to find all images selected by all multi select are uploaded
                    number_of_inputs--;
                    if(number_of_inputs == 0) {
                        //All images selected by each file selector is uploaded
                        //Do necessary acteion post upload
                        $('.overlay').hide();
                    }
                } else {
                    if (typeof jsonResponse.error_field_name != 'undefined') {
                        //Do appropriate error action
                    } else {
                        alert(jsonResponse.message);
                    }
                    $('.overlay').hide();
                    event.preventDefault();
                    return false;
                }
            } else {
                /*alert('Something went wrong!');*/
                $('.overlay').hide();
                event.preventDefault();
            }
        };
        xhr.send(formData);
    })

    return false;
}

@Bhargav : 설명에 대한 블로그 게시물을 참조하십시오 goo.gl/umgFFy를 . 여전히 궁금한 점이 있으면 답장 해주세요
Ima

7

나는 이것을 간단한 코드로 처리했다. 여기 에서 작동하는 데모를 다운로드 할 수 있습니다

귀하의 경우, 매우 가능합니다. AJAX jquery를 사용하여 파일을 서버에 업로드하는 방법을 단계별로 안내합니다.

먼저 아래와 같이 폼 파일 요소를 추가 할 HTML 파일을 만들어 봅시다.

<form action="" id="formContent" method="post" enctype="multipart/form-data" >
         <input  type="file" name="file"  required id="upload">
         <button class="submitI" >Upload Image</button> 
</form>

두 번째로 jquery.js 파일을 만들고 다음 코드를 추가하여 파일 제출을 서버에 처리하십시오.

    $("#formContent").submit(function(e){
        e.preventDefault();

    var formdata = new FormData(this);

        $.ajax({
            url: "ajax_upload_image.php",
            type: "POST",
            data: formdata,
            mimeTypes:"multipart/form-data",
            contentType: false,
            cache: false,
            processData: false,
            success: function(){
                alert("file successfully submitted");
            },error: function(){
                alert("okey");
            }
         });
      });
    });

거기서 끝났습니다. 더보기


7

많은 답변으로 표시된 것처럼 FormData를 사용하는 방법입니다. 이 목적을 위해 잘 작동하는 약간의 코드가 있습니다. 또한 복잡한 상황을 완료하기 위해 Ajax 블록을 중첩한다는 의견에 동의합니다. e.PreventDefault ()를 포함함으로써; 내 경험상 코드를 더 크로스 브라우저 호환 가능하게 만듭니다.

    $('#UploadB1').click(function(e){        
    e.preventDefault();

    if (!fileupload.valid()) {
        return false;            
    }

    var myformData = new FormData();        
    myformData.append('file', $('#uploadFile')[0].files[0]);

    $("#UpdateMessage5").html("Uploading file ....");
    $("#UpdateMessage5").css("background","url(../include/images/loaderIcon.gif) no-repeat right");

    myformData.append('mode', 'fileUpload');
    myformData.append('myid', $('#myid').val());
    myformData.append('type', $('#fileType').val());
    //formData.append('myfile', file, file.name); 

    $.ajax({
        url: 'include/fetch.php',
        method: 'post',
        processData: false,
        contentType: false,
        cache: false,
        data: myformData,
        enctype: 'multipart/form-data',
        success: function(response){
            $("#UpdateMessage5").html(response); //.delay(2000).hide(1); 
            $("#UpdateMessage5").css("background","");

            console.log("file successfully submitted");
        },error: function(){
            console.log("not okay");
        }
    });
});

이것은 jquery validate ... if (! fileupload.valid ()) {return false; }
Mike Volmar 1

7

순수한 js를 사용하면 더 쉽습니다.

async function saveFile(inp) 
{
    let formData = new FormData();           
    formData.append("file", inp.files[0]);
    await fetch('/upload/somedata', {method: "POST", body: formData});    
    alert('success');
}
<input type="file" onchange="saveFile(this)" >

  • 서버 측에서는 요청에 자동으로 포함 된 원본 파일 이름 (및 기타 정보)을 읽을 수 있습니다.
  • 헤더 "Content-Type"을 "multipart / form-data"로 설정할 필요는 없습니다. 브라우저가 자동으로 설정합니다
  • 이 솔루션은 모든 주요 브라우저에서 작동해야합니다.

다음은 오류 처리 및 추가 json 전송 기능이있는 더 발달 된 스 니펫입니다.


6

예, javascript를 사용하여 파일을 가져 와서 파일을 데이터 URL로 읽을 수 있습니다. base64 이전의 내용을 구문 분석하여 실제로 base 64로 인코딩 된 데이터를 얻은 다음 PHP 또는 실제로 백엔드 언어를 사용하는 경우 base 64 데이터를 디코딩하고 아래와 같이 파일에 저장할 수 있습니다

Javascript:
var reader = new FileReader();
reader.onloadend = function ()
{
  dataToBeSent = reader.result.split("base64,")[1];
  $.post(url, {data:dataToBeSent});
}
reader.readAsDataURL(this.files[0]);


PHP:
    file_put_contents('my.pdf', base64_decode($_POST["data"]));

물론 어떤 파일 형식을 처리하는지 확인하는 것과 같은 유효성 검사를 원할 것입니다. 그러나 이것이 아이디어입니다.


file_put_contents ($ fname, file_get_contents ($ _ POST [ 'data'])); file_get_contents는 디코딩 및 data : // 헤더를 처리합니다
Nande

5
<html>
    <head>
        <title>Ajax file upload</title>
        <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
        <script>
            $(document).ready(function (e) {
            $("#uploadimage").on('submit', (function(e) {
            e.preventDefault();
                    $.ajax({
                    url: "upload.php", // Url to which the request is send
                            type: "POST", // Type of request to be send, called as method
                            data: new FormData(this), // Data sent to server, a set of key/value pairs (i.e. form fields and values)
                            contentType: false, // The content type used when sending data to the server.
                            cache: false, // To unable request pages to be cached
                            processData:false, // To send DOMDocument or non processed data file it is set to false
                            success: function(data)   // A function to be called if request succeeds
                            {
                            alert(data);
                            }
                    });
            }));
        </script>
    </head>
    <body>
        <div class="main">
            <h1>Ajax Image Upload</h1><br/>
            <hr>
            <form id="uploadimage" action="" method="post" enctype="multipart/form-data">
                <div id="image_preview"><img id="previewing" src="noimage.png" /></div>
                <hr id="line">
                <div id="selectImage">
                    <label>Select Your Image</label><br/>
                    <input type="file" name="file" id="file" required />
                    <input type="submit" value="Upload" class="submit" />
                </div>
            </form>
        </div>
    </body>
</html>

4

서버에 업로드 해야하는 파일을 선택할 때 다음과 같이 ajaxSubmit 메소드를 사용할 수 있습니다.

$(document).ready(function () {
    var options = {
    target: '#output',   // target element(s) to be updated with server response
    timeout: 30000,
    error: function (jqXHR, textStatus) {
            $('#output').html('have any error');
            return false;
        }
    },
    success: afterSuccess,  // post-submit callback
    resetForm: true
            // reset the form after successful submit
};

$('#idOfInputFile').on('change', function () {
    $('#idOfForm').ajaxSubmit(options);
    // always return false to prevent standard browser submit and page navigation
    return false;
});
});

2
jquery form plugin 에 대해 이야기하고 있다고 생각합니다 . 답변에 세부 정보가 부족한 것을 제외하고는 여기에서 가장 좋은 옵션입니다.
fotanus

@ fotanus 당신이 맞아요! 이 스크립트는 jquery 양식 플러그인을 사용하여 jquery 양식 플러그인에 정의 된 ajaxSubmit 사용 메소드를 제출해야합니다.
Quy Le

4

jquery를 사용하여 양식의 일부로 사용자가 제출 한 파일을 업로드하려면 아래 코드를 따르십시오.

var formData = new FormData();
formData.append("userfile", fileInputElement.files[0]);

그런 다음 양식 데이터 개체를 서버로 보냅니다.

File 또는 Blob을 FormData 객체에 직접 추가 할 수도 있습니다.

data.append("myfile", myBlob, "filename.txt");

3

AJAX를 사용하여 파일을 업로드하려면 파일 업로드에 사용할 수있는 코드가 있습니다.

$(document).ready(function() {
    var options = { 
                beforeSubmit:  showRequest,
        success:       showResponse,
        dataType: 'json' 
        }; 
    $('body').delegate('#image','change', function(){
        $('#upload').ajaxForm(options).submit();        
    }); 
});     
function showRequest(formData, jqForm, options) { 
    $("#validation-errors").hide().empty();
    $("#output").css('display','none');
    return true; 
} 
function showResponse(response, statusText, xhr, $form)  { 
    if(response.success == false)
    {
        var arr = response.errors;
        $.each(arr, function(index, value)
        {
            if (value.length != 0)
            {
                $("#validation-errors").append('<div class="alert alert-error"><strong>'+ value +'</strong><div>');
            }
        });
        $("#validation-errors").show();
    } else {
         $("#output").html("<img src='"+response.file+"' />");
         $("#output").css('display','block');
    }
}

파일 업로드를위한 HTML은 다음과 같습니다.

<form class="form-horizontal" id="upload" enctype="multipart/form-data" method="post" action="upload/image'" autocomplete="off">
    <input type="file" name="image" id="image" /> 
</form>

3

type = "file" 을 포함하여 모든 양식 입력을 가져 오려면 FormData object 를 사용해야 합니다 . 양식을 제출하면 디버거-> 네트워크-> 헤더 에서 formData 컨텐츠를 볼 수 있습니다 .

var url = "YOUR_URL";

var form = $('#YOUR_FORM_ID')[0];
var formData = new FormData(form);


$.ajax(url, {
    method: 'post',
    processData: false,
    contentType: false,
    data: formData
}).done(function(data){
    if (data.success){ 
        alert("Files uploaded");
    } else {
        alert("Error while uploading the files");
    }
}).fail(function(data){
    console.log(data);
    alert("Error while uploading the files");
});

2
var dataform = new FormData($("#myform")[0]);
//console.log(dataform);
$.ajax({
    url: 'url',
    type: 'POST',
    data: dataform,
    async: false,
    success: function(res) {
        response data;
    },
    cache: false,
    contentType: false,
    processData: false
});

5
세부 정보를 추가하여 답변을 향상시킬 수 있습니다
SR

1

여기 내가 생각한 아이디어가 있습니다.

Have an iframe on page and have a referencer.

INPUT : File 요소를 이동할 양식을 작성하십시오.

Form:  A processing page AND a target of the FRAME.

결과는 프레임에 게시 된 다음 가져온 데이터를 원하는 이미지 태그로 원하는 수준으로 보낼 수 있습니다.

data:image/png;base64,asdfasdfasdfasdfa

페이지가로드됩니다.

나는 그것이 나를 위해 작동한다고 생각하며, 당신에 따라 다음과 같은 일을 할 수 있습니다.

.aftersubmit(function(){
    stopPropigation()// or some other code which would prevent a refresh.
});

이것이 이전에 주어진 다른 답변을 어떻게 향상시키는 지 알 수 없습니다. 또한 전파가 아닌 전파입니다 ! ;)
JDuarteDJ
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.