Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Не получать сделать загрузку файла с прогрессом при нажатии Submit? (https://javascript.ru/forum/misc/82791-ne-poluchat-sdelat-zagruzku-fajjla-s-progressom-pri-nazhatii-submit.html)

Olga27 06.07.2021 10:20

Не получать сделать загрузку файла с прогрессом при нажатии Submit?
 
Нашла в интернете исходники где сделано загрузку файла. В консоле отображается прогресс (сколько в процентах загрузилось). Все это происходит при изменении поле input (change), вот пример кода.
<input type="file" name="afile" id="afile"/>


<script>

document.querySelector('#afile').addEventListener('change', function(e) 
{
//document.getElementById('upload-form').addEventListener('submit', function(e)( 
 e.preventDefault();
//document.querySelector('#afile').addEventListener('change', function(e) {
  var file = this.files[0];

  var fd = new FormData();
  fd.append("afile", file);
  // These extra params aren't necessary but show that you can include other data.
  fd.append("username", "Groucho");
  fd.append("accountnum", 123456);

  var xhr = new XMLHttpRequest();
  xhr.open('POST', 'handle_file_upload.php', true);
  
  xhr.upload.onprogress = function(e) {
    if (e.lengthComputable) {
      var percentComplete = (e.loaded / e.total) * 100;
      console.log(percentComplete + '% uploaded');
    }
  };

  xhr.onload = function() {
   console.log(this.responseText);
   // if (this.status == 200) {
    //  var resp = JSON.parse(this.response);

     // console.log('Server got:', resp);

    //  var image = document.createElement('img');
    //  image.src = resp.dataUrl;
    //  document.body.appendChild(image);
    //};
  };

  xhr.send(fd);
}, false);
</script>

</body>
</html>


Код выше работает. Пытаюсь его переделать, чтобы все это происходило через нажатии кнопки submit, но почему-то ничего не происходит файл не грузится, мой переделанный код.

<form method="post" name="upload" id="upload-form"><div>
<input type="file" name="afile" id="afile"/>
<input class="in_input" type="submit" value="Загрузить"></div>
</form>  

<script>

document.getElementById('upload-form').addEventListener('submit', function(e)
{
console.log("Test");
 var file = this.files[0];

  var fd = new FormData();
  fd.append("afile", file);
  // These extra params aren't necessary but show that you can include other data.
  fd.append("username", "Groucho");
  fd.append("accountnum", 123456);

  var xhr = new XMLHttpRequest();
  xhr.open('POST', 'handle_file_upload.php', true);
  
  xhr.upload.onprogress = function(e) {
    if (e.lengthComputable) {
      var percentComplete = (e.loaded / e.total) * 100;
      console.log(percentComplete + '% uploaded');
    }
  };
  
   xhr.onload = function() {
   console.log(this.responseText);
   // if (this.status == 200) {
    //  var resp = JSON.parse(this.response);

     // console.log('Server got:', resp);

    //  var image = document.createElement('img');
    //  image.src = resp.dataUrl;
    //  document.body.appendChild(image);
    //};
  };

   xhr.send(fd);
}, false);
</script>

</body>
</html>


Как можно исправить, чтобы при выборе файла и нажатии submit он грузился в папку?

Olga27 06.07.2021 12:31

Понятно
Цитата:

var file = this.myfile.files[0];
, это получение файла input, чтобы загрузить его, а если у меня будут еще текстовые поля как их получить чтобы передать на сервер?

Rise 06.07.2021 21:01

Olga27,
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Form</title>
</head>
<body>

<form id="formX" action="upload.php" method="post" enctype="multipart/form-data">
    <input id="textX" type="text" name="textX" value="" required>
    <input id="fileX" type="file" name="fileX" value="" required>
    <input id="buttonX" type="submit" value="Submit">
    <progress id="progressX" max="100" value="0"></progress>
    <div id="responseX"></div>
</form>

<script>
document.querySelector('#formX').addEventListener('submit', function(e) {
    //return; // Displaying upload.php
    e.preventDefault();
 
    var formData = new FormData(this), // this = form
        progress = this.querySelector('#progressX'),
        response = this.querySelector('#responseX');

    //formData.append('formId', this.id); // Extra fields
    progress.value = 0;
    response.innerHTML = 'Uploading...';
 
    var xhr = new XMLHttpRequest();
    xhr.open(this.method, this.action, true);
    //xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest'); // Detecting AJAX
    xhr.upload.onprogress = function(e) {
        if (e.lengthComputable) { 
            progress.value = (e.loaded / e.total) * 100;
        }
    };
    xhr.onload = function() {
        if (this.status == 200) {
            response.innerHTML = this.responseText;
        } else {
            response.innerHTML = 'Server error!';
        }
    };
    xhr.onerror = function() {
        response.innerHTML = 'Network error!';
    };
    xhr.send(formData);

    // PHP variables: $_POST['textX'], $_FILES['fileX']
    // Optional: $_POST['formId'], $_SERVER['HTTP_X_REQUESTED_WITH']
});
</script>

</body>
</html>

Olga27 07.07.2021 09:17

При нажатии кнопки если поля пустые то появляется сообщение "заполните поле" и выберите файл, а как добавить еще одно условие например чтобы можно было загружать файлы не больше определенного размера к примеру 50 мб.

ksa 07.07.2021 10:14

Цитата:

Сообщение от Olga27
а как добавить еще одно условие например чтобы можно было загружать файлы не больше определенного размера к примеру 50 мб.

Пример работы с полем file...
<input class="input" id="uploadInput" type="file">
<div id="e-fileinfo"></div>

<script>
function updateSize() {
	var file = document.getElementById("uploadInput").files[0],
	ext = "не определилось",
	parts = file.name.split('.');
	if (parts.length > 1) ext = parts.pop();
	document.getElementById("e-fileinfo").innerHTML = [
		"Размер файла: " + file.size + " B",
		"Расширение: " + ext,
		"MIME тип: " + file.type
	].join("<br>");
}

document.getElementById('uploadInput').addEventListener('change', updateSize);
</script>

Rise 07.07.2021 12:57

Olga27, изи
document.querySelector('#fileX').addEventListener('change', function(e) {
    this.setCustomValidity('');
    for (var i = 0; i < this.files.length; i++) {
        if (this.files[i].size / (1024 * 1024) > 50) {
            this.setCustomValidity('Maximum file size 50 MB');
            break;
        }
    }
    if (this.reportValidity) this.reportValidity();
});

ksa, в Хром, если в окне выбора файла нажать Отмена, то files.length будет 0.

ksa 07.07.2021 15:32

Цитата:

Сообщение от Rise
если в окне выбора файла нажать Отмена, то files.length будет 0

Добавить тогда проверку... Всего делов. :)
Мой пример лишь иллюстрация того, где и какие данные по файлу можно взять.
Пример не обязан отрабатывать все "аварийные" условия...


Часовой пояс GMT +3, время: 02:52.