mirror of
https://github.com/Alexander-D-Karpov/akarpov
synced 2024-11-22 19:06:41 +03:00
updated file upload
This commit is contained in:
parent
26a523a9b5
commit
d29860397a
|
@ -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 %}
|
||||||
|
|
|
@ -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 & Drop background image(s) inside dashed region<br><i>or</i></p>
|
<p class="small my-2">Drag & 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
|
||||||
data.submit();
|
console.log("add", data.files[0])
|
||||||
$("#progress").css("display", "flex");
|
form_data.splice(1);
|
||||||
|
calculate_md5(data.files[0], 1000000);
|
||||||
|
data.submit();
|
||||||
|
$("#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 %}
|
||||||
|
|
23
akarpov/users/migrations/0008_alter_user_left_file_upload.py
Normal file
23
akarpov/users/migrations/0008_alter_user_left_file_upload.py
Normal 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)",
|
||||||
|
),
|
||||||
|
),
|
||||||
|
]
|
|
@ -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)]
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user