के तहत एकाधिक फ़ाइल अपलोड करने के लिए कैसे करें एचटीएमएल 5 चंकिंग का उपयोग करके, मैं छोटे टुकड़े के साथ फ़ाइल अपलोड कर सकता था। लेकिन समस्या तब शुरू होती है जब उसने एकाधिक http POST अनुरोध का उपयोग शुरू किया जो कंप्यूटर को धीमा कर देगा, या शायद क्रैश हो जाएगा। क्या वैसे भी एक http अनुरोध के तहत विभाजित फ़ाइल है .. इसलिए यदि मेरे पास 5 फाइलें हैं तो यह केवल 5 http अनुरोध होगा, हालांकि मैं html5 स्प्लिट खंड1 http अनुरोध
उदाहरण: यदि मैं 5 फाइल अपलोड करता हूं, तो प्रत्येक फ़ाइल विभाजित होगी 1 एमबी खंड में, इसलिए यदि पहली फ़ाइल 10 एमबी है, तो यह 1 एमबी खंड के 10 टुकड़े बन जाएगी। और समस्या यह है कि, प्रत्येक खंड 1 http अनुरोध के तहत होगा, इसलिए केवल पहली फ़ाइल यह 10 HTTP अनुरोध होगी। कल्पना करें कि मेरे पास 1 जीबी फाइलें हैं, तो यह 1000 HTTP अनुरोध बन जाएगी और कंप्यूटर को धीमा कर देगा।
इस उदाहरण कोड है:
//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);
}
और प्राप्त करने के लिए सर्वर हिस्सा हो 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);
}
आप अपनी फ़ाइलों को कई भागों में विभाजित है, तो क्यों आप उन्हें पहली जगह में विभाजित हो जाते हैं नहीं करना चाहते हैं? – Carsten
नहीं, मुझे उन्हें विभाजित करने की आवश्यकता है। क्योंकि 1. PHP में अपलोड सीमा है (मुझे पता है कि मैं उस सीमा को बदल सकता हूं, लेकिन यह वास्तव में एक असली समाधान नहीं है) 2. इस तरह से मैं इसे कई टुकड़ों को एक साथ अपलोड कर सकता हूं जो इसे तेज़ी से बना देगा। – Harts
असल में स्प्लिट फ़ाइल मुझे फिर से शुरू करने वाली फ़ाइल (मामले में अचानक कनेक्शन के मामले में) प्राप्त करने में मदद करेगी, उपयोगकर्ता को शुरुआत से शुरुआत नहीं करना पड़ेगा – Harts