Получить данные из файла ввода в JQuery

На самом деле у меня есть файл ввода, и я хотел бы получить данные Base64 файла.

Я старался:

$('input#myInput')[0].files[0] 

чтобы получить данные. Но он предоставляет только имя, длину, тип контента, но не сами данные.

Мне на самом деле нужны эти данные, чтобы отправить их на Amazon S3

Я уже тестировал API, и когда я отправляю данные через HTML-форму с типом кодирования "multipart/form-data", он работает.

Я использую этот плагин: http://jasny.github.com/bootstrap/javascript.html

И этот плагин дает мне предварительный просмотр изображения, и я получаю данные в атрибуте src предварительного просмотра изображения. Но когда я отправляю эти данные на S3, это не работает. Возможно, мне нужно закодировать данные как "multipart/form-data", но я не знаю почему.

Есть ли способ получить эти данные без использования HTML-формы?

10 ответов

Решение

Вы можете попробовать API FileReader как-то так.

<!DOCTYPE html>
<html>
<head>
<script>        
  function handleFileSelect()
  {               
    if (!window.File || !window.FileReader || !window.FileList || !window.Blob) {
      alert('The File APIs are not fully supported in this browser.');
      return;
    }   

    input = document.getElementById('fileinput');
    if (!input) {
      alert("Um, couldn't find the fileinput element.");
    }
    else if (!input.files) {
      alert("This browser doesn't seem to support the `files` property of file inputs.");
    }
    else if (!input.files[0]) {
      alert("Please select a file before clicking 'Load'");               
    }
    else {
      file = input.files[0];
      fr = new FileReader();
      fr.onload = receivedText;
      //fr.readAsText(file);
      fr.readAsDataURL(file);
    }
  }

  function receivedText() {
    document.getElementById('editor').appendChild(document.createTextNode(fr.result));
  }           

</script>
</head>
<body>
<input type="file" id="fileinput"/>
<input type='button' id='btnLoad' value='Load' onclick='handleFileSelect();'>
<div id="editor"></div>
</body>
</html>

Элемент входного файла:

<input type="file" id="fileinput" />

получить файл:

var myFile = $('#fileinput').prop('files');

Я создал объект данных формы и добавил файл:

var form = new FormData(); 
form.append("video", $("#fileInput")[0].files[0]);

и я получил:

------WebKitFormBoundaryNczYRonipfsmaBOK
Content-Disposition: form-data; name="video"; filename="Wildlife.wmv"
Content-Type: video/x-ms-wmv

в заголовках отправлено. Я могу подтвердить, что это работает, потому что мой файл был отправлен и сохранен в папке на моем сервере. Если вы не знаете, как использовать объект FormData, в Интернете есть некоторая документация, но немного. Объяснение объекта данных формы от Mozilla

Html:

<input type="file" name="input-file" id="input-file">

JQuery:

var fileToUpload = $('#input-file').prop('files')[0];

Мы хотим получить только первый элемент, потому что prop('files') возвращает массив.

input элемент, типа file

<input id="fileInput" type="file" />

На ваше input изменить использовать FileReader возражать и читать ваши input свойство файла:

$('#fileInput').on('change', function () {
    var fileReader = new FileReader();
    fileReader.onload = function () {
      var data = fileReader.result;  // data <-- in this var you have the file data in Base64 format
    };
    fileReader.readAsDataURL($('#fileInput').prop('files')[0]);
});

FileReader загрузит ваш файл и в fileReader.result у вас есть данные файла в формате Base64 (также тип содержимого файла (MIME), text/plain, image/jpg и т. д.)

FileReader API с jQuery, простой пример.

( function ( $ ) {
 // Add click event handler to button
 $( '#load-file' ).click( function () {
  if ( ! window.FileReader ) {
   return alert( 'FileReader API is not supported by your browser.' );
  }
  var $i = $( '#file' ), // Put file input ID here
   input = $i[0]; // Getting the element from jQuery
  if ( input.files && input.files[0] ) {
   file = input.files[0]; // The file
   fr = new FileReader(); // FileReader instance
   fr.onload = function () {
    // Do stuff on onload, use fr.result for contents of file
    $( '#file-content' ).append( $( '<div/>' ).html( fr.result ) )
   };
   //fr.readAsText( file );
   fr.readAsDataURL( file );
  } else {
   // Handle errors here
   alert( "File not selected or browser incompatible." )
  }
 } );
} )( jQuery );
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="file" id="file" />
<input type='button' id='load-file' value='Load'>
<div id="file-content"></div>

Читать как текст... раскомментировать //fr.readAsText(file); строка и комментарий fr.readAsDataURL(file);

Получить файл с помощью jquery

HTML элемент:

       <input id="fileInput" type="file" />

jquery-код:

       $("#fileInput")[0].files[0]

эта работа для меня :)

HTML

      <div class="row form-group my-2">
                <div class="col-12">
                    <div class="">
                        <div class="text-center">
                            <label for="inpImage" class="m-2 pointer">
                                <img src="src/img/no-image.jpg" id="img-visor" height="120" class="rounded mx-auto d-block">
                            </label>
                            <input type="file" class="visually-hidden" accept="image/*" name="picture" id="inpImage">
                        </div>
                    </div>
                </div>
            </div>

jQuery

      $('#inpImage').change(()=>{
const file = $('#inpImage').prop("files")[0];
const imagen = URL.createObjectURL(file);
console.log(URL.createObjectURL(file));
$('#img-visor').attr('src', imagen);
});
 <script src="~/fileupload/fileinput.min.js"></script>
 <link href="~/fileupload/fileinput.min.css" rel="stylesheet" />

Загрузите вышеуказанные файлы с именем fileinput и добавьте путь к вашей странице индекса.

<div class="col-sm-9 col-lg-5" style="margin: 0 0 0 8px;">
<input id="uploadFile1" name="file" type="file" class="file-loading"       
 `enter code here`accept=".pdf" multiple>
</div>

<script>
        $("#uploadFile1").fileinput({
            autoReplace: true,
            maxFileCount: 5
        });
</script>

Другие вопросы по тегам