Add file base64 encode/decode tool
This commit is contained in:
parent
82042634bd
commit
029168bcde
@ -18,6 +18,13 @@ input:disabled, textarea:disabled {
|
|||||||
opacity: 1;
|
opacity: 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
button {
|
||||||
|
display: inline-block;
|
||||||
|
padding: 0 5px;
|
||||||
|
margin: 0 2px;
|
||||||
|
@apply text-gray-900 bg-white border border-gray-300 focus:outline-none hover:bg-gray-100 focus:ring-4 focus:ring-gray-100 text-sm dark:bg-gray-800 dark:text-white dark:border-gray-600 dark:hover:bg-gray-700 dark:hover:border-gray-600 dark:focus:ring-gray-700;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Tools
|
* Tools
|
||||||
*/
|
*/
|
||||||
|
@ -28,7 +28,6 @@ export default {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
console.log(monacoResultInst);
|
|
||||||
loader.init().then((monaco) => {
|
loader.init().then((monaco) => {
|
||||||
monacoResultInst = monaco;
|
monacoResultInst = monaco;
|
||||||
|
|
||||||
|
@ -31,6 +31,7 @@ export default {
|
|||||||
'table_to_mediawiki_table': 'Table to Mediawiki table',
|
'table_to_mediawiki_table': 'Table to Mediawiki table',
|
||||||
'dummy_image': 'Dummy image',
|
'dummy_image': 'Dummy image',
|
||||||
'humans_txt': 'humans.txt generator',
|
'humans_txt': 'humans.txt generator',
|
||||||
|
'file_base64_encode_decode': 'File base64 encode/decode',
|
||||||
},
|
},
|
||||||
'Strings': {
|
'Strings': {
|
||||||
'fix_ru_en_keyboard': 'Fix ru-en keyboard',
|
'fix_ru_en_keyboard': 'Fix ru-en keyboard',
|
||||||
|
@ -80,6 +80,11 @@ const router = createRouter({
|
|||||||
name: 'url_query_viewer',
|
name: 'url_query_viewer',
|
||||||
component: () => import('../views/UrlQueryViewer.vue'),
|
component: () => import('../views/UrlQueryViewer.vue'),
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
path: '/file_base64_encode_decode',
|
||||||
|
name: 'file_base64_encode_decode',
|
||||||
|
component: () => import('../views/FileBase64EncodeDecode.vue'),
|
||||||
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* JSON manipulation
|
* JSON manipulation
|
||||||
|
101
src/views/FileBase64EncodeDecode.vue
Normal file
101
src/views/FileBase64EncodeDecode.vue
Normal file
@ -0,0 +1,101 @@
|
|||||||
|
<template>
|
||||||
|
<h2 class="tool-title">File base64 encode/decode</h2>
|
||||||
|
<hr class="mt-5 mb-5">
|
||||||
|
|
||||||
|
<div class="input-group" v-if="toolData.base64Mode === 'encode'">
|
||||||
|
<label for="data">Data</label>
|
||||||
|
<input type="file" ref="fileEncodeUpload" @change="encode" />
|
||||||
|
</div>
|
||||||
|
<div class="input-group" v-if="toolData.base64Mode === 'decode'">
|
||||||
|
<label for="data">Data</label>
|
||||||
|
<textarea id="data" v-model="toolData.data"></textarea>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="input-group" v-if="toolData.base64Mode === 'encode'">
|
||||||
|
<label>Strip mime/type</label>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<input id="strip_mime" name="strip_mime" v-model="toolData.stripMime" v-on:change="encode" type="checkbox"> <label for="strip_mime">strip mime</label>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="input-group">
|
||||||
|
<label>Mode</label>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<input id="base64_mode_encode" value="encode" name="base64_mode" v-model="toolData.base64Mode" type="radio"> <label for="base64_mode_encode">file -> base64</label><br>
|
||||||
|
<input id="base64_mode_decode" value="decode" name="base64_mode" v-model="toolData.base64Mode" type="radio"> <label for="base64_mode_decode">base64 -> file</label>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<hr class="mt-5 mb-5">
|
||||||
|
|
||||||
|
<div class="input-group" v-if="toolData.base64Mode === 'encode'">
|
||||||
|
<label for="result">Result</label>
|
||||||
|
<MonacoEditor name="result" language="text" :value="toolResult"></MonacoEditor>
|
||||||
|
</div>
|
||||||
|
<div class="input-group" v-if="toolData.base64Mode === 'decode'">
|
||||||
|
<label for="result">Result</label>
|
||||||
|
<button v-on:click="decode">Decode & download</button>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import MonacoEditor from "@/components/MonacoEditor.vue";
|
||||||
|
|
||||||
|
export default {
|
||||||
|
components: {
|
||||||
|
MonacoEditor
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
toolData: {
|
||||||
|
data: '',
|
||||||
|
base64Mode: 'encode',
|
||||||
|
stripMime: true,
|
||||||
|
},
|
||||||
|
toolResult: '',
|
||||||
|
};
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
encode() {
|
||||||
|
const file = this.$refs.fileEncodeUpload.files[0];
|
||||||
|
const reader = new FileReader();
|
||||||
|
|
||||||
|
reader.onload = () => {
|
||||||
|
if (this.toolData.stripMime) {
|
||||||
|
this.toolResult = reader.result.split(',')[1];
|
||||||
|
} else {
|
||||||
|
this.toolResult = reader.result;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
if (file) {
|
||||||
|
reader.readAsDataURL(file);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
decode() {
|
||||||
|
const byteCharacters = atob(this.toolData.data.split(',')[1] ?? this.toolData.data);
|
||||||
|
const byteNumbers = new Array(byteCharacters.length);
|
||||||
|
|
||||||
|
// create file
|
||||||
|
for (let i = 0; i < byteCharacters.length; i++) {
|
||||||
|
byteNumbers[i] = byteCharacters.charCodeAt(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
const byteArray = new Uint8Array(byteNumbers);
|
||||||
|
const blob = new Blob([byteArray], { type: 'application/octet-stream' });
|
||||||
|
|
||||||
|
// download
|
||||||
|
const link = document.createElement('a');
|
||||||
|
link.href = URL.createObjectURL(blob);
|
||||||
|
link.download = 'file';
|
||||||
|
link.click();
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss">
|
||||||
|
|
||||||
|
</style>
|
@ -351,13 +351,6 @@ export default {
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss">
|
<style lang="scss">
|
||||||
button {
|
|
||||||
display: inline-block;
|
|
||||||
padding: 0 5px;
|
|
||||||
margin: 0 2px;
|
|
||||||
@apply text-gray-900 bg-white border border-gray-300 focus:outline-none hover:bg-gray-100 focus:ring-4 focus:ring-gray-100 text-sm dark:bg-gray-800 dark:text-white dark:border-gray-600 dark:hover:bg-gray-700 dark:hover:border-gray-600 dark:focus:ring-gray-700;
|
|
||||||
}
|
|
||||||
|
|
||||||
.humans-group {
|
.humans-group {
|
||||||
padding: 10px 0;
|
padding: 10px 0;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user