mirror of
				https://github.com/Alexander-D-Karpov/akarpov
				synced 2025-10-31 15:37:32 +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 | ||||||
|  |           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 %} | ||||||
|  |  | ||||||
							
								
								
									
										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