updated file upload

This commit is contained in:
Alexander Karpov 2023-04-11 00:45:51 +03:00
parent 26a523a9b5
commit d29860397a
4 changed files with 49 additions and 15 deletions

View File

@ -97,7 +97,7 @@
</div> </div>
</div> </div>
</div> </div>
<div class="col d-flex flex-column h-sm-100"> <div id="body" class="col d-flex flex-column h-sm-100">
<main class="row overflow-aut px-lg-4"> <main class="row overflow-aut px-lg-4">
<div class="col pt-4"> <div class="col pt-4">
{% if messages %} {% if messages %}

View File

@ -45,8 +45,8 @@
<svg class="upload_svg" width="60" height="60" aria-hidden="true"> <svg class="upload_svg" width="60" height="60" aria-hidden="true">
<use href="#icon-imageUpload"></use> <use href="#icon-imageUpload"></use>
</svg> </svg>
<p class="small my-2">Drag &amp; Drop background image(s) inside dashed region<br><i>or</i></p> <p class="small my-2">Drag &amp; Drop file(s) <br><i>or</i></p>
<input multiple class="position-absolute invisible" id="chunked_upload" type="file" name="the_file"> <input class="position-absolute invisible" id="chunked_upload" type="file" name="the_file">
<label class="btn btn-upload mb-3" for="chunked_upload">Choose file(s)</label> <label class="btn btn-upload mb-3" for="chunked_upload">Choose file(s)</label>
<div class="upload_gallery d-flex flex-wrap justify-content-center gap-3 mb-0"></div> <div class="upload_gallery d-flex flex-wrap justify-content-center gap-3 mb-0"></div>
</fieldset> </fieldset>
@ -118,11 +118,13 @@
var md5 = "", var md5 = "",
csrf = $("input[name='csrfmiddlewaretoken']")[0].value, csrf = $("input[name='csrfmiddlewaretoken']")[0].value,
form_data = [{"name": "csrfmiddlewaretoken", "value": csrf}]; form_data = [{"name": "csrfmiddlewaretoken", "value": csrf}];
function calculate_md5(file, chunk_size) { function calculate_md5(file, chunk_size) {
var slice = File.prototype.slice || File.prototype.mozSlice || File.prototype.webkitSlice, var slice = File.prototype.slice || File.prototype.mozSlice || File.prototype.webkitSlice,
chunks = Math.ceil(file.size / chunk_size), chunks = Math.ceil(file.size / chunk_size),
current_chunk = 0, current_chunk = 0,
spark = new SparkMD5.ArrayBuffer(); spark = new SparkMD5.ArrayBuffer();
function onload(e) { function onload(e) {
spark.append(e.target.result); // append chunk spark.append(e.target.result); // append chunk
current_chunk++; current_chunk++;
@ -132,6 +134,7 @@
md5 = spark.end(); md5 = spark.end();
} }
}; };
function read_next_chunk() { function read_next_chunk() {
var reader = new FileReader(); var reader = new FileReader();
reader.onload = onload; reader.onload = onload;
@ -141,21 +144,31 @@
}; };
read_next_chunk(); read_next_chunk();
} }
let ind = 0;
let files = [] let body = $("#body")
let cur = false
$("#chunked_upload").fileupload({ $("#chunked_upload").fileupload({
url: "{% url 'files:api_chunked_upload' %}", url: "{% url 'files:api_chunked_upload' %}",
dataType: "json", dataType: "json",
maxChunkSize: 1000000, // Chunks of 1000 kB maxChunkSize: 1000000, // Chunks of 1000 kB
formData: form_data, formData: form_data,
prependFiles: true,
dropZone: body,
pasteZone: body,
sequentialUploads: true, sequentialUploads: true,
autoUpload: false,
add: function(e, data) { // Called before starting upload add: function(e, data) { // Called before starting upload
files.push(data.files[0]) if (cur !== true){
calculate_md5(files[ind], 1000000); // Again, chunks of 1000 kB cur = true
console.log("add", data.files[0])
form_data.splice(1);
calculate_md5(data.files[0], 1000000);
data.submit(); data.submit();
$("#progress").css("display", "flex"); $("#progress").css("display", "flex");
}
}, },
chunkdone: function (e, data) { // Called after uploading each chunk chunkdone: function (e, data) { // Called after uploading each chunk
console.log("chunkdone", data.files[0])
if (form_data.length < 2) { if (form_data.length < 2) {
form_data.push( form_data.push(
{"name": "upload_id", "value": data.result.upload_id} {"name": "upload_id", "value": data.result.upload_id}
@ -167,6 +180,7 @@
sel.text(progress + "%"); sel.text(progress + "%");
}, },
done: function (e, data) { // Called when the file has completely uploaded done: function (e, data) { // Called when the file has completely uploaded
console.log("done", data.files[0])
$.ajax({ $.ajax({
type: "POST", type: "POST",
url: "{% url 'files:api_chunked_upload_complete' %}", url: "{% url 'files:api_chunked_upload_complete' %}",
@ -188,11 +202,8 @@
$("#progress-message").empty() $("#progress-message").empty()
} }
}); });
ind ++; cur = false
if (ind !== files.length){
calculate_md5(files[ind], 1000000);
} }
},
}) })
</script> </script>
{% endblock %} {% endblock %}

View File

@ -0,0 +1,23 @@
# Generated by Django 4.2 on 2023-04-10 16:50
import django.core.validators
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("users", "0007_user_left_file_upload"),
]
operations = [
migrations.AlterField(
model_name="user",
name="left_file_upload",
field=models.BigIntegerField(
default=0,
validators=[django.core.validators.MinValueValidator(0)],
verbose_name="Left file upload(in bites)",
),
),
]

View File

@ -1,6 +1,6 @@
from django.contrib.auth.models import AbstractUser from django.contrib.auth.models import AbstractUser
from django.core.validators import MinValueValidator from django.core.validators import MinValueValidator
from django.db.models import CharField, IntegerField, TextField from django.db.models import BigIntegerField, CharField, TextField
from django.urls import reverse from django.urls import reverse
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
@ -22,7 +22,7 @@ class User(AbstractUser, BaseImageModel, ShortLink):
last_name = None # type: ignore last_name = None # type: ignore
# files # files
left_file_upload = IntegerField( left_file_upload = BigIntegerField(
"Left file upload(in bites)", default=0, validators=[MinValueValidator(0)] "Left file upload(in bites)", default=0, validators=[MinValueValidator(0)]
) )