@MaxKondratenko

Почему после загрузки на сервер файлов XMLHttpRequest() методом FileReader, получаются файлы большего размера?

Загружаю файлы на сервер, но после загрузки получаются большего размера...

function uploadFile(file) {
  
  alert(file.name);
  var reader = new FileReader();
 
  reader.onload = function() {    
    var xhr = new XMLHttpRequest();    
    
    xhr.upload.addEventListener("progress", function(e) {
      if (e.lengthComputable) {
        var progress = (e.loaded * 100) / e.total;
			
//			alert('Loading : = '+progress+' file: '+file.name+'');
	}
    }, false);
    
    /* ... можно обрабатывать еще события load и error объекта xhr.upload ... */
 
    xhr.onreadystatechange = function () {
      if (this.readyState == 4) {
        if(this.status == 200) {
          	       alert(xhr.responseText);
		  		  
                  } else {
		  alert('error');
        }
      }
    };
    
    xhr.open('POST', '../lib/upload.php');
   var boundary = "xxxxxxxxx";
        // Устанавливаем заголовки.
        xhr.setRequestHeader('Content-type', 'multipart/form-data; boundary="' + boundary + '"');
        xhr.setRequestHeader('Cache-Control', 'no-cache');

        // Формируем тело запроса.
        var body = "--" + boundary + "\r\n";
        body += "Content-Disposition: form-data; name='myFile'; filename='" + unescape( encodeURIComponent(file.name)) + "'\r\n"; // unescape позволит отправлять файлы с русскоязычными именами без проблем.
        body += "Content-Type: application/octet-stream\r\n\r\n";
        body += reader.result + "\r\n";
        body += "--" + boundary + "--";
    if(xhr.sendAsBinary) {
      // только для firefox
      xhr.sendAsBinary(body);
    } else {
      // chrome (так гласит спецификация W3C)
      xhr.send(body);
    }
  };
  // Читаем файл
  reader.readAsBinaryString(file);
}


метод описанный на тысячи сайтов... и тупо скопированный ...
на серверной стороне выглядит так :

<?php
$uploaddir = '../uploads/';
$uploadfile = $uploaddir.basename($_FILES['myFile']['name']);

echo '<pre>';
if (move_uploaded_file($_FILES['myFile']['tmp_name'], $uploadfile)) {
    echo "File is valid, and was successfully uploaded.\n";
} else {
    echo "Possible file upload attack!\n";
}
echo 'Here is some more debugging info:';

print_r($_FILES);

print "</pre>";
?>
  • Вопрос задан
  • 2789 просмотров
Решения вопроса 2
Petroveg
@Petroveg
Миром правят маленькие с#@&ки
Как советуют на stackoverflow, нужно читать файл по-другому:

reader.readAsBinaryString(file) => reader.readAsDataURL(file)
Ответ написан
@MaxKondratenko Автор вопроса
Спасибо user
С его помощью переписал скрипт на стороне сервера и получилось следующие.
Плюс добавил рандомное имя файла! Всё собрано по кускам с разных ресурсов. Часть решения взял отсюда:
<?php
$uploaddir = '../uploads/';
$uploadfile = $uploaddir.basename($_FILES['myFile']['name']);

if ($file_handle = fopen($_FILES['myFile']['tmp_name'], "r")) {
	while (!feof($file_handle)) {
		$encodedData = fgets($file_handle);
		//echo $encodedData;
	}
	fclose($file_handle);
}
else echo 'произошла ошибка!';

// Выделим данные
	$split = explode(',', $encodedData);
	$encodedData = end($split);

// Декодируем данные, закодированные алгоритмом MIME base64
	$encodedData = str_replace(' ','+',$encodedData);
	$decocedData = base64_decode($encodedData);

$file = $decocedData;
$name = $_FILES['myFile']['name'];

// Получаем расширение файла
$getMime = explode('.', $name);
$mime = end($getMime);

// Мы будем создавать произвольное имя!
$randomName = substr_replace(sha1(microtime(true)), '', 12).'.'.$mime;

// Создаем изображение на сервере
if(file_put_contents($uploaddir.$randomName, $decocedData)) {
   echo $randomName.":загружен успешно";
}
else {
   // Показать сообщение об ошибке, если что-то пойдет не так.
   echo "Что-то пошло не так. Убедитесь, что файл не поврежден!";
}
?>
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы