Мой сайт размещен на Godaddy и работает на PHP. У меня проблема с загрузкой файлов с использованием чанков. Проблема только с определенными файлами. Один такой файл имеет размер 5,13 МБ. Я могу загружать намного большие файлы размером 20 МБ и даже меньшие файлы. Проблема только с этим файлом. Я проверил содержание, и это не проблема с контентом. Это чистый .txt файл. Этот файл загружается в 6 чанках, а в 6-м чанке выдается 500 Внутренняя ошибка сервера. Он способен успешно обрабатывать файлы, которые разделены примерно на 20 блоков (размер каждого блока равен 1 МБ). Я пробовал в Chrome и Edge и та же проблема.
Я использую следующий код JavaScript для разбиения на фрагменты и загрузки контента. Я много гуглил, но моя проблема, кажется, уникальна, и я не мог найти решение нигде. Большинство ответов относятся к 500 ошибкам, связанным с размером файла. Но, как я уже говорил, я могу загружать большие файлы.
function sendRequest() {
for(var i=0; i<document.getElementById('file').files.length; i++) {
var blob = document.getElementById('file').files[i];
var BYTES_PER_CHUNK = 1048576;//100 * 1024 * 1024; // 1MB chunk sizes.
//var BYTES_PER_CHUNK = 100 * 1024 * 1024; // 100MB chunk sizes.
var SIZE = blob.size;
var start = 0;
var end = BYTES_PER_CHUNK;
//alert(window["uploadcounter" + i]);
window["uploadcounter" + i]=0;
window["uploadfilearray" + i] = [];
document.getElementById('uploadPercent' + i).innerHTML = "Upload: 0 % ";
while( start < SIZE ) {
var chunk = blob.slice(start, end);
window["uploadfilearray" + i][window["uploadcounter" + i]]=chunk;
window["uploadcounter" + i]=window["uploadcounter" + i]+1;
start = end;
end = start + BYTES_PER_CHUNK;
}
window["uploadcounter" + i]=0;
uploadFile(window["uploadfilearray" + i][window["uploadcounter" + i]], document.getElementById('file').files[i].name, i);
// setInterval(new function() {updateFileProcessingStatus(document.getElementById('file').files[i].name)}, 3000);
}
}
var chunkNumber = 0;
function uploadFile(blobFile, filename, fileIndex) {
alert(blobFile.size + ' chunknumber: ' + ++chunkNumber);
var fd = new FormData();
fd.append("fileToUpload", blobFile);
var xhr = new XMLHttpRequest();xhr.addEventListener("load", uploadComplete, false);
xhr.addEventListener("error", uploadFailed, false);
xhr.addEventListener("abort", uploadCanceled, false);
xhr.open("POST", "./datafileupload.php?filename="+filename + "&chunkNumber=" + chunkNumber + "&r=" + Math.random());
xhr.onload = function(e) {
window["uploadcounter" + fileIndex] = window["uploadcounter" + fileIndex] + 1;
if(window["uploadfilearray" + fileIndex].length > window["uploadcounter" + fileIndex] ){
uploadFile(window["uploadfilearray" + fileIndex][window["uploadcounter" + fileIndex]], filename, fileIndex);
var percentloaded2 = parseInt((window["uploadcounter" + fileIndex]/window["uploadfilearray" + fileIndex].length)*100);
$('#uploadPercent' + fileIndex).html('Upload Percent : '+ filename + ' ' + percentloaded2+' % ');
$('#progressbar' + fileIndex).attr('style', 'width:' + percentloaded2 + '%');
}else{
$('#progressbar' + fileIndex).attr('style', 'width: 100%');
$('#uploadPercent' + fileIndex).html("File uploaded");
processFile(filename);
}
};
xhr.send(fd);
}
Также с другой стороны ниже приведен код php, обрабатывающий загруженный файл.
<?php
ini_set('max_execution_time', 10000);
require("dbconfig.php");
ini_set('auto_detect_line_endings', true);
if ((!isset($_SESSION['newsession']) || $_SESSION['newsession'] == false) && $_SESSION["ROLE"] == 'Admin'){
$name2 = $_GET['filename'];
echo "the chunk received is " . $_GET["chunkNumber"];
$extension = end((explode(".", $name2)));
if($extension != 'csv' || $extension != 'txt') {
exit;
}
$lowerCaseName = strtolower($name2);
$isValidCSV = 0;
if(strpos($lowerCaseName, "gsa") !== false) {
$isValidCSV = 1;
} else if(strpos($lowerCaseName, "product") !== false) {
$isValidCSV = 1;
} else if(strpos($lowerCaseName, "image") !== false) {
$isValidCSV = 1;
} else if(strpos($lowerCaseName, "supplier") !== false) {
$isValidCSV = 1;
} else if(strpos($lowerCaseName, "account") !== false) {
$isValidCSV = 1;
}
if($isValidCSV === 0) {
exit;
}
$name = $_FILES['fileToUpload']['name'];
$target_path = "./uploadedfiles/";
$tmp_name = $_FILES['fileToUpload']['tmp_name'];
$target_file = $target_path.$name;
$complete =$target_path.$name2;
$com = fopen($complete, "ab");
error_log($target_path);
// Open temp file
//$out = fopen($target_file, "wb");
//if ( $out ) {
// Read binary input stream and append it to temp file
$in = fopen($tmp_name, "rb");
if ( $in ) {
while($buff = fread( $in, 1048576 )) {
fwrite($com, $buff);
}
}
fclose($in);
//}
//fclose($out);
fclose($com);
}else{
echo'you are not logged in.';
}
?>
Задача ещё не решена.
Других решений пока нет …