abubaca

Untitled

Mar 13th, 2021
1,086
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. var ecg_id = document.getElementById('ecg_id_field')
  2. var sample_frequency = document.getElementById('sample_frequency_field')
  3. var amplitude_resolution = document.getElementById('amplitude_resolution_field')
  4. var fileInput = document.getElementById('ecg_file_select')
  5. var uploadBtn = document.getElementById('check_and_upload')
  6. const csrftoken = document.querySelector('[name=csrfmiddlewaretoken]').value;
  7.  
  8. //если crypto.subtle по той или иной причине не поддерживается подключить CryptoJS
  9. if (crypto.subtle == undefined) {
  10.     var CryptoJS_script = document.createElement('script');
  11.     CryptoJS_script.type = 'text/javascript';
  12.     //необходимо подключить только необходимые модули долгая загрузка https://cdnjs.com/libraries/crypto-js
  13.     CryptoJS_script.src = "https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.0.0/crypto-js.min.js";
  14.     //CryptoJS_script.integrity="sha512-nOQuvD9nKirvxDdvQ9OMqe2dgapbPB7vYAMrzJihw5m+aNcf0dX53m6YxM4LgA9u8e9eg9QX+/+mPu8kCNpV2A==";
  15.     //CryptoJS_script.crossorigin="anonymous";
  16.     document.head.appendChild(CryptoJS_script);
  17. }
  18.  
  19. function arrayBufferToWordArray(ab) {
  20.     var i8a = new Uint8Array(ab);
  21.     var a = [];
  22.     for (var i = 0; i < i8a.length; i += 4) {
  23.       a.push(i8a[i] << 24 | i8a[i + 1] << 16 | i8a[i + 2] << 8 | i8a[i + 3]);
  24.     }
  25.     return CryptoJS.lib.WordArray.create(a, i8a.length);
  26. }
  27.  
  28. function CryptoJS_Get_Sha1_FromFile(inputFile){
  29.     var hash;
  30.  
  31.     var reader = new FileReader();
  32.     reader.onload = (function(result) {
  33.         return async function(e) {
  34.             var arrayBuffer = e.target.result;
  35.             result = CryptoJS.SHA1(arrayBufferToWordArray(arrayBuffer));
  36.         };
  37.     })(hash);
  38.     reader.readAsArrayBuffer(inputFile);
  39.     return Array.prototype.map.call(new Uint8Array(hash), x=>(('00'+x.toString(16)).slice(-2))).join('');
  40. }
  41.  
  42. async function getFileHash_crypto(inputFile, hashAlgorithm){
  43.     var hash;
  44.  
  45.     var reader = new FileReader();
  46.     //назначение действия после полного чтения файла
  47.     reader.onload = (function(result) {
  48.         return async function(e) {
  49.             //создание хеша средствами браузера может не поддерживаться в старых браузерах(или если соединение не https)
  50.             result = await crypto.subtle.digest(hashAlgorithm, e.target.result);
  51.         };
  52.     })(hash);
  53.     //чтение файла
  54.     reader.readAsArrayBuffer(inputFile);
  55.     //преобразование ArrayBuffer к строке
  56.     return Array.prototype.map.call(new Uint8Array(hash), x=>(('00'+x.toString(16)).slice(-2))).join('');
  57. }
  58.  
  59. async function getSHA_1FromFile(inputFile) {
  60.     //использовать CryptoJS если crypto.subtle не поддерживается
  61.     if (crypto.subtle == undefined) {
  62.         return CryptoJS_Get_Sha1_FromFile(inputFile);
  63.     } else {
  64.         return await getFileHash_crypto(inputFile, 'SHA-1');
  65.     }
  66. }
  67.  
  68. document.getElementById('ecg_upload_form').addEventListener("submit", async function(evt) {
  69.     //запрет стандартного действия после нажатия sumbit
  70.     evt.preventDefault();
  71.  
  72.     //получение хеша файла
  73.     const fileHash = await getSHA_1FromFile(fileInput.files[0]);
  74.  
  75.     //разделение имени файла на несколько подстрок для получения расширения файла
  76.     var splitFileName = fileInput.files[0].name.split('.');
  77.     //добавить вывод ошибки если файл не имеет расширения
  78.     if (splitFileName.length < 2) {
  79.         return;
  80.     }
  81.  
  82.     //формирование post запроса
  83.     var formData = new FormData();
  84.     formData.append('ecg_id_field', ecg_id.value);
  85.     formData.append('sample_frequency_field', sample_frequency.value);
  86.     formData.append('amplitude_resolution_field', amplitude_resolution.value);
  87.     formData.append('file_format', splitFileName[splitFileName.length - 1]);
  88.     formData.append('file_hash', fileHash);
  89.  
  90.     axios({
  91.         method: "post",
  92.         url: document.URL,
  93.         data: formData,
  94.         headers: { "Content-Type": "multipart/form-data", "X-CSRFToken": csrftoken},
  95.       })
  96.         .then(function (response) {
  97.           //handle success
  98.           console.log(response);
  99.         })
  100.         .catch(function (response) {
  101.           //handle error
  102.           console.log(response.response);
  103.         });
  104. });
Advertisement
Add Comment
Please, Sign In to add comment