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]);반환 undefined및 console.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.