Utilizando fragmentación HTML5, pude cargar archivos con una pieza más pequeña. Pero el problema comienza cuando comenzó a usar múltiples solicitudes HTTP POST que causarán que la computadora se desacelere o probablemente se bloquee. ¿Hay alguna forma de tener el archivo dividido bajo una solicitud http ... así que si tengo 5 archivos sería solo 5 solicitud HTTP aunque utilizo la división html5Cómo cargar archivos múltiples en 1 solicitud HTTP
por ejemplo: si cargo 5 archivos, cada archivo se dividirá a 1mb, así que si el primer archivo es 10mb, entonces se convertirán en 10 piezas de 1mb. Y el problema es que cada fragmento tendrá menos de 1 solicitud HTTP, por lo que solo el primer archivo será 10 solicitudes HTTP. Imagine que si tengo archivos de 1 gb, se convertirá en 1000 solicitudes HTTP y ralentizará la computadora.
Esto es código de ejemplo:
//Prepare element progress after the page load completely
var uploaders = [];
var totalChunks = 0;
var progress;
var bars;
$(document).ready(function() {
//progress = document.querySelector('progress');
//bars = document.querySelector('#bars');
});
//function for after the button is clicked, slice the file
//and call upload function
function sendRequest() {
//clean the screen
//bars.innerHTML = '';
var file = document.getElementById('fileToUpload');
for(var i = 0; i < file.files.length; i++) {
var blob = file.files[i];
var originalFileName = blob.name;
var filePart = 0
const BYTES_PER_CHUNK = 10 * 1024 * 1024; // 10MB chunk sizes.
const SIZE = blob.size;
var start = 0;
var end = BYTES_PER_CHUNK;
totalChunks = Math.ceil(SIZE/BYTES_PER_CHUNK);
while(start < SIZE) {
if (blob.webkitSlice) {
//for Google Chrome
var chunk = blob.webkitSlice(start, end);
} else if (blob.mozSlice) {
//for Mozilla Firefox
var chunk = blob.mozSlice(start, end);
}
uploadFile(chunk, originalFileName, filePart, totalChunks, i);
filePart++;
start = end;
end = start + BYTES_PER_CHUNK;
}
}
}
function uploadFile(blobFile, fileName) {
var fd = new FormData();
fd.append("fileToUpload", blobFile);
var xm = $.ajax({
url: "upload.php"+"?"+"file1="+fileName,
type: "POST",
data: fd,
processData: false,
contentType: false,
});
}
function uploadFile(blobFile, fileName, filePart, totalChunks, divBarsSelector) {
if(filePart == 0) {
bars = document.querySelector('#bars' + divBarsSelector);
}
var progress = document.createElement('progress');
progress.min = 0;
progress.max = 100;
progress.value = 0;
bars.appendChild(progress);
var fd = new FormData();
fd.append("fileToUpload", blobFile);
var xhr = new XMLHttpRequest();
xhr.open("POST", "upload.php"+"?"+"file="+fileName + filePart, true);
xhr.onload = function(e) {
//make sure if finish progress bar at 100%
progress.value = 100;
//counter if everything is done using stack
uploaders.pop();
if (!uploaders.length) {
bars.appendChild(document.createElement('br'));
bars.appendChild(document.createTextNode('DONE :)'));
//mergeFile(fileName, totalChunks);
}
};
// Listen to the upload progress for each upload.
xhr.upload.onprogress = function(e) {;
if (e.lengthComputable) {
progress.value = (e.loaded/e.total) * 100;
}
};
uploaders.push(xhr);
xhr.send(fd);
}
y la parte del servidor de recepción habrá upload.php
$target_path = "uploads/";
$tmp_name = $_FILES['fileToUpload']['tmp_name'];
$size = $_FILES['fileToUpload']['size'];
$name = $_FILES['fileToUpload']['name'];
$originalName = $_GET['file'];
print_r("*******************************************\n");
print_r($originalName);
print_r("\n");
print_r($_FILES);
print_r("\n");
print_r("*******************************************\n");
$target_file = $target_path . basename($name);
//Result File
$complete = $originalName;
$com = fopen("uploads/".$complete, "ab");
error_log($target_path);
if ($com) {
// 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($com);
}
Si no desea que los archivos divididos en varias partes, entonces ¿por qué se les dividirá en el primer lugar? – Carsten
No, los necesito para dividir. porque 1. PHP tiene un límite de carga (sé que puedo cambiar ese límite, pero esa no es realmente una solución real) 2. de esa manera puedo subirlo varias piezas a la vez, lo cual lo hará más rápido. – Harts
en realidad el archivo dividido también me ayudará a lograr la reanudación del archivo (en caso de que la conexión se desconecte repentinamente), el usuario no tiene que volver a empezar desde el principio – Harts