|
59 | 59 | <strong>Send a file</strong>
|
60 | 60 | <input type="file" id="put-file-select" />
|
61 | 61 | <div id="put-file-list"></div>
|
62 |
| - <input type="button" value="Send to device" id="put-file-button" onclick="put_file(); return false;" /> |
| 62 | + <input type="button" value="Send to device" id="put-file-button" onclick="reread_and_put_file(); return false;" /> |
63 | 63 | </div>
|
64 | 64 |
|
65 | 65 | <div class="file-box">
|
|
85 | 85 | var connected = false;
|
86 | 86 | var binary_state = 0;
|
87 | 87 | var put_file_name = null;
|
| 88 | +var put_file_lastMod = null; |
88 | 89 | var put_file_data = null;
|
| 90 | +var put_file_reader = null; |
89 | 91 | var get_file_name = null;
|
90 | 92 | var get_file_data = null;
|
91 | 93 |
|
|
339 | 341 | ws.send(rec);
|
340 | 342 | }
|
341 | 343 |
|
| 344 | +function reread_and_put_file() { |
| 345 | + if(put_file_reader) put_file_reader(()=>{put_file()}); |
| 346 | +} |
| 347 | + |
342 | 348 | function handle_put_file_select(evt) {
|
343 | 349 | // The event holds a FileList object which is a list of File objects,
|
344 | 350 | // but we only support single file selection at the moment.
|
345 | 351 | var files = evt.target.files;
|
346 |
| - |
| 352 | + var file = files[0]; |
| 353 | + |
347 | 354 | // Get the file info and load its data.
|
348 |
| - var f = files[0]; |
349 |
| - put_file_name = f.name; |
| 355 | + put_file_name = file.name; |
| 356 | + put_file_lastMod = -1; // reset |
| 357 | + put_file_reader = (callback) => { |
| 358 | + read_put_file(file,callback); |
| 359 | + } |
| 360 | + document.getElementById('put-file-button').disabled = false; |
| 361 | + put_file_message(''); |
| 362 | +} |
| 363 | + |
| 364 | +function put_file_changed(file) { |
| 365 | + if (file && put_file_lastMod && file.lastModified !== put_file_lastMod) { |
| 366 | + var initial = put_file_lastMod===-1; // Initial load? |
| 367 | + put_file_lastMod = file.lastModified; |
| 368 | + console.log("Updating lastMod to ",put_file_lastMod); |
| 369 | + return initial ? 1 : true; |
| 370 | + } |
| 371 | + return false; |
| 372 | +} |
| 373 | + |
| 374 | +function put_file_message(msg, suffix) { |
| 375 | + if (suffix) msg=escape(put_file_name) + ' - ' + put_file_data.length + ' bytes ' +msg; |
| 376 | + document.getElementById('put-file-list').innerHTML = msg; |
| 377 | +} |
| 378 | + |
| 379 | +function read_put_file(file,callback) { |
| 380 | + var changed = put_file_changed(file); |
| 381 | + if (!changed) { |
| 382 | + update_file_status("[Unchanged]",true); |
| 383 | + return; |
| 384 | + } |
350 | 385 | var reader = new FileReader();
|
351 | 386 | reader.onload = function(e) {
|
352 | 387 | put_file_data = new Uint8Array(e.target.result);
|
353 |
| - document.getElementById('put-file-list').innerHTML = '' + escape(put_file_name) + ' - ' + put_file_data.length + ' bytes'; |
354 |
| - document.getElementById('put-file-button').disabled = false; |
| 388 | + put_file_message(changed === true ? "[Changed]" : "",true); |
| 389 | + if(changed && callback) callback(); |
355 | 390 | };
|
356 |
| - reader.readAsArrayBuffer(f); |
| 391 | + reader.onerror= function(e) { |
| 392 | + update_file_status("[Error: Must Choose File Again]") |
| 393 | + console.log("Error Reading File " + escape(put_file_name) + ': ',e.target.error); |
| 394 | + } |
| 395 | + reader.readAsArrayBuffer(file); |
357 | 396 | }
|
358 |
| - |
| 397 | + |
| 398 | + |
359 | 399 | document.getElementById('put-file-select').addEventListener('click', function(){
|
360 | 400 | this.value = null;
|
361 | 401 | }, false);
|
|
0 commit comments