mirror of
https://github.com/BobbyWibowo/lolisafe.git
synced 2025-01-18 17:21:33 +00:00
Updates
* Added No-JS uploader page (it's on /nojs). * Updated uploadsController.processFilesForDisplay() to support requests from No-JS uploader page. * Added "Bash uploader" link to footer. * Updated icons (added terminal icon for "Bash uploader" footer link).
This commit is contained in:
parent
dd5a5d699a
commit
4923cf9800
@ -395,64 +395,76 @@ uploadsController.writeFilesToDb = async (req, res, user, infoMap) => {
|
||||
|
||||
uploadsController.processFilesForDisplay = async (req, res, files, existingFiles) => {
|
||||
const basedomain = config.domain
|
||||
if (files.length === 0) {
|
||||
return res.json({
|
||||
success: true,
|
||||
files: existingFiles.map(file => {
|
||||
return {
|
||||
name: file.name,
|
||||
size: file.size,
|
||||
url: `${basedomain}/${file.name}`
|
||||
}
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
// Insert new files to DB
|
||||
await db.table('files').insert(files)
|
||||
|
||||
// Push existing files to array for response
|
||||
for (const efile of existingFiles) {
|
||||
files.push(efile)
|
||||
}
|
||||
|
||||
const albumids = []
|
||||
for (const file of files) {
|
||||
const ext = path.extname(file.name).toLowerCase()
|
||||
if ((config.uploads.generateThumbnails.image && utils.imageExtensions.includes(ext)) || (config.uploads.generateThumbnails.video && utils.videoExtensions.includes(ext))) {
|
||||
file.thumb = `${basedomain}/thumbs/${file.name.slice(0, -ext.length)}.png`
|
||||
utils.generateThumbs(file)
|
||||
}
|
||||
if (file.albumid && !albumids.includes(file.albumid)) {
|
||||
albumids.push(file.albumid)
|
||||
}
|
||||
}
|
||||
|
||||
let albumSuccess = true
|
||||
if (albumids.length) {
|
||||
const editedAt = Math.floor(Date.now() / 1000)
|
||||
await Promise.all(albumids.map(albumid => {
|
||||
return db.table('albums')
|
||||
.where('id', albumid)
|
||||
.update('editedAt', editedAt)
|
||||
.then(() => {})
|
||||
.catch(error => {
|
||||
console.log(error)
|
||||
albumSuccess = false
|
||||
})
|
||||
}))
|
||||
}
|
||||
let mappedFiles
|
||||
|
||||
return res.json({
|
||||
success: albumSuccess,
|
||||
description: albumSuccess ? null : 'Warning: Album may not have been properly updated.',
|
||||
files: files.map(file => {
|
||||
if (files.length) {
|
||||
// Insert new files to DB
|
||||
await db.table('files').insert(files)
|
||||
|
||||
// Push existing files to array for response
|
||||
for (const efile of existingFiles) {
|
||||
files.push(efile)
|
||||
}
|
||||
|
||||
const albumids = []
|
||||
for (const file of files) {
|
||||
const ext = path.extname(file.name).toLowerCase()
|
||||
if ((config.uploads.generateThumbnails.image && utils.imageExtensions.includes(ext)) || (config.uploads.generateThumbnails.video && utils.videoExtensions.includes(ext))) {
|
||||
file.thumb = `${basedomain}/thumbs/${file.name.slice(0, -ext.length)}.png`
|
||||
utils.generateThumbs(file)
|
||||
}
|
||||
if (file.albumid && !albumids.includes(file.albumid)) {
|
||||
albumids.push(file.albumid)
|
||||
}
|
||||
}
|
||||
|
||||
if (albumids.length) {
|
||||
const editedAt = Math.floor(Date.now() / 1000)
|
||||
await Promise.all(albumids.map(albumid => {
|
||||
return db.table('albums')
|
||||
.where('id', albumid)
|
||||
.update('editedAt', editedAt)
|
||||
.then(() => {})
|
||||
.catch(error => {
|
||||
console.log(error)
|
||||
albumSuccess = false
|
||||
})
|
||||
}))
|
||||
}
|
||||
|
||||
mappedFiles = files.map(file => {
|
||||
return {
|
||||
name: file.name,
|
||||
size: file.size,
|
||||
url: `${basedomain}/${file.name}`
|
||||
}
|
||||
})
|
||||
} else {
|
||||
mappedFiles = existingFiles.map(file => {
|
||||
return {
|
||||
name: file.name,
|
||||
size: file.size,
|
||||
url: `${basedomain}/${file.name}`
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
if (req.params.nojs) {
|
||||
return res.render('nojs', {
|
||||
layout: false,
|
||||
files: mappedFiles.map(file => {
|
||||
const exec = /.[\w]+(\?|$)/.exec(file.url)
|
||||
file.image = exec && exec[0] && utils.imageExtensions.includes(exec[0].toLowerCase())
|
||||
return file
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
return res.json({
|
||||
success: albumSuccess,
|
||||
description: albumSuccess ? null : 'Warning: Album may not have been properly updated.',
|
||||
files: mappedFiles
|
||||
})
|
||||
}
|
||||
|
||||
|
@ -1,6 +1,7 @@
|
||||
const config = require('./config.js')
|
||||
const api = require('./routes/api.js')
|
||||
const album = require('./routes/album.js')
|
||||
const nojs = require('./routes/nojs.js')
|
||||
const express = require('express')
|
||||
const helmet = require('helmet')
|
||||
const bodyParser = require('body-parser')
|
||||
@ -46,6 +47,7 @@ if (config.serveFilesWithNode) {
|
||||
|
||||
safe.use('/', express.static('./public', { setHeaders }))
|
||||
safe.use('/', album)
|
||||
safe.use('/', nojs)
|
||||
safe.use('/api', api)
|
||||
|
||||
for (const page of config.pages) {
|
||||
|
@ -11,7 +11,7 @@
|
||||
|
||||
<!-- Stylesheets and scripts -->
|
||||
<link rel="stylesheet" type="text/css" href="libs/bulma/bulma.min.css?v=vvtL7Y3cjD">
|
||||
<link rel="stylesheet" type="text/css" href="libs/fontello/fontello.css?v=vvtL7Y3cjD">
|
||||
<link rel="stylesheet" type="text/css" href="libs/fontello/fontello.css?v=cjjyPrikAR">
|
||||
<link rel="stylesheet" type="text/css" href="css/style.css?v=vvtL7Y3cjD">
|
||||
<script type="text/javascript" src="libs/sweetalert/sweetalert.min.js?v=vvtL7Y3cjD"></script>
|
||||
<script type="text/javascript" src="libs/axios/axios.min.js?v=vvtL7Y3cjD"></script>
|
||||
|
@ -11,7 +11,7 @@
|
||||
|
||||
<!-- Stylesheets and scripts -->
|
||||
<link rel="stylesheet" type="text/css" href="libs/bulma/bulma.min.css?v=vvtL7Y3cjD">
|
||||
<link rel="stylesheet" type="text/css" href="libs/fontello/fontello.css?v=vvtL7Y3cjD">
|
||||
<link rel="stylesheet" type="text/css" href="libs/fontello/fontello.css?v=cjjyPrikAR">
|
||||
<link rel="stylesheet" type="text/css" href="css/style.css?v=vvtL7Y3cjD">
|
||||
<link rel="stylesheet" type="text/css" href="css/dashboard.css?v=8XQkPhnc2S">
|
||||
<script type="text/javascript" src="libs/sweetalert/sweetalert.min.js?v=vvtL7Y3cjD"></script>
|
||||
|
@ -85,17 +85,23 @@
|
||||
<article class="message">
|
||||
<div class="message-body">
|
||||
Simply create a user on the site and every upload will be associated with your account, granting you access to your uploaded files through our dashboard.<br>
|
||||
<br>
|
||||
By having an account, you will also be able to set a preferred file name length!
|
||||
By having an account, you will also be able to set file name length for your new uploads!
|
||||
</div>
|
||||
</article>
|
||||
|
||||
<h2 class='subtitle'>Do you have any No-JS uploader?</h2>
|
||||
<article class="message">
|
||||
<div class="message-body">
|
||||
Yes, check out <a href="../nojs" target="_blank">this page</a>.<br>
|
||||
Unfortunately you will not be able to associate your uploads to your account, if you have any.<br>
|
||||
Then again, if you want to use the No-JS uploader, then it's very likely that you will not use the Dashboard anyways.
|
||||
</div>
|
||||
</article>
|
||||
|
||||
<h2 class='subtitle'>What are albums?</h2>
|
||||
<article class="message">
|
||||
<div class="message-body">
|
||||
Albums are a simple way of sorting uploads together. Right now you can create albums through the dashboard and use them <s>only</s>* with <a target="_blank" href="https://chrome.google.com/webstore/detail/loli-safe-uploader/enkkmplljfjppcdaancckgilmgoiofnj">our chrome extension</a> which will enable you to <strong>right click -> send to lolisafe</strong> or to a desired album if you have any. You will probably have to change some things involving https://safe.fiery.me/api/upload.<br>
|
||||
<br>
|
||||
* You are no longer required to use the chrome extension to utilize albums. As long as you are logged in, you will be able to choose your albums from the upload page (of course the albums have to be created beforehand through the dashboard).
|
||||
Albums are a simple way of sorting uploads together. Right now you can create albums through the dashboard, then afterwards you can use them through the homepage uploader or with <a href="https://chrome.google.com/webstore/detail/loli-safe-uploader/enkkmplljfjppcdaancckgilmgoiofnj" target="_blank">our chrome extension</a>, which will enable you to <strong>right click -> send to lolisafe</strong> or to a desired album if you have any. You will probably have to change some things involving <b>https://safe.fiery.me/api/upload</b> if you want to use the extension though.
|
||||
</div>
|
||||
</article>
|
||||
|
||||
@ -109,20 +115,14 @@
|
||||
<h2 class='subtitle'>I saw something too illegal for my tastes here, what do?</h2>
|
||||
<article class="message">
|
||||
<div class="message-body">
|
||||
Send a strongly worded email to <a href="mailto:bobby@fiery.me">bobby@fiery.me</a> and I will <i>try</i> to get back to you within 24 hours.
|
||||
Send a strongly worded email to <a href="mailto:bobby@fiery.me">bobby@fiery.me</a> and I will try to get back to you within 24 hours.
|
||||
</div>
|
||||
</article>
|
||||
|
||||
<h2 class='subtitle'>Do you support chunked uploads?</h2>
|
||||
<article class="message">
|
||||
<div class="message-body">
|
||||
Yes. Just add three text fields containing the file's UUID, the chunk's index and the total amount of chunks, named "uuid", "chunkindex" and "totalchunkcount" respectively, into the multipart/form-data that you POST to https://safe.fiery.me/api/upload.<br>
|
||||
Once all chunks have been successfully uploaded, then you have to POST a JSON request to https://safe.fiery.me/api/upload/finishchunks containing the file's UUID, original filename, original size, mime type and chunk counts, with keys "uuid", "original", "size", "type" and "count" respectively (make sure the object is inside an array named "files").<br>
|
||||
Check out <a href="https://gist.github.com/BobbyWibowo/de9ef40426421ae6c5e2999556e70521" target="_blank">this gist</a> for an example POST request.<br>
|
||||
<br>
|
||||
If that sounds too complicated, then just try to trigger chunked uploads with the home page's uploader and inspect the HTTP requests...<br>
|
||||
<br>
|
||||
By the way, "totalchunkcount" can be omitted if the amount of chunks is only 10 or less.
|
||||
Yes, the homepage uploader will chunk your uploads into 10 MB pieces by default. If you want to utilize chunked uploads with the API, then feel free to inspect the HTTP requests.
|
||||
</div>
|
||||
</article>
|
||||
|
||||
|
@ -11,7 +11,7 @@
|
||||
|
||||
<!-- Stylesheets and scripts -->
|
||||
<link rel="stylesheet" type="text/css" href="libs/bulma/bulma.min.css?v=vvtL7Y3cjD">
|
||||
<link rel="stylesheet" type="text/css" href="libs/fontello/fontello.css?v=vvtL7Y3cjD">
|
||||
<link rel="stylesheet" type="text/css" href="libs/fontello/fontello.css?v=cjjyPrikAR">
|
||||
<link rel="stylesheet" type="text/css" href="css/style.css?v=vvtL7Y3cjD">
|
||||
<script type="text/javascript" src="libs/sweetalert/sweetalert.min.js?v=vvtL7Y3cjD"></script>
|
||||
<script type="text/javascript" src="libs/dropzone/dropzone.min.js?v=vvtL7Y3cjD"></script>
|
||||
@ -155,6 +155,11 @@
|
||||
<i class="icon-chrome icon-2x"></i>
|
||||
</span>
|
||||
</a>
|
||||
<a href="https://github.com/BobbyWibowo/uguush/tree/lolisafe-kde" target="_blank" title="Bash uploader">
|
||||
<span class="icon is-medium">
|
||||
<i class="icon-terminal icon-2x"></i>
|
||||
</span>
|
||||
</a>
|
||||
<a href="faq" title="FAQ">
|
||||
<span class="icon is-medium">
|
||||
<i class="icon-help-circled icon-2x"></i>
|
||||
|
@ -1,15 +1,6 @@
|
||||
Font license info
|
||||
|
||||
|
||||
## Elusive
|
||||
|
||||
Copyright (C) 2013 by Aristeides Stathopoulos
|
||||
|
||||
Author: Aristeides Stathopoulos
|
||||
License: SIL (http://scripts.sil.org/OFL)
|
||||
Homepage: http://aristeides.com/
|
||||
|
||||
|
||||
## Typicons
|
||||
|
||||
(c) Stephen Hutchings 2012
|
||||
@ -19,6 +10,15 @@ Font license info
|
||||
Homepage: http://typicons.com/
|
||||
|
||||
|
||||
## Elusive
|
||||
|
||||
Copyright (C) 2013 by Aristeides Stathopoulos
|
||||
|
||||
Author: Aristeides Stathopoulos
|
||||
License: SIL (http://scripts.sil.org/OFL)
|
||||
Homepage: http://aristeides.com/
|
||||
|
||||
|
||||
## Font Awesome
|
||||
|
||||
Copyright (C) 2016 by Dave Gandy
|
||||
|
13
public/libs/fontello/fontello.css
vendored
13
public/libs/fontello/fontello.css
vendored
@ -1,11 +1,11 @@
|
||||
@font-face {
|
||||
font-family: 'fontello';
|
||||
src: url('fontello.eot?5742890');
|
||||
src: url('fontello.eot?5742890#iefix') format('embedded-opentype'),
|
||||
url('fontello.woff2?5742890') format('woff2'),
|
||||
url('fontello.woff?5742890') format('woff'),
|
||||
url('fontello.ttf?5742890') format('truetype'),
|
||||
url('fontello.svg?5742890#fontello') format('svg');
|
||||
src: url('fontello.eot?93747628');
|
||||
src: url('fontello.eot?93747628#iefix') format('embedded-opentype'),
|
||||
url('fontello.woff2?93747628') format('woff2'),
|
||||
url('fontello.woff?93747628') format('woff'),
|
||||
url('fontello.ttf?93747628') format('truetype'),
|
||||
url('fontello.svg?93747628#fontello') format('svg');
|
||||
font-weight: normal;
|
||||
font-style: normal;
|
||||
}
|
||||
@ -70,6 +70,7 @@
|
||||
.icon-login:before { content: '\e80c'; } /* '' */
|
||||
.icon-home:before { content: '\e80d'; } /* '' */
|
||||
.icon-help-circled:before { content: '\e80f'; } /* '' */
|
||||
.icon-terminal:before { content: '\e810'; } /* '' */
|
||||
.icon-github-circled:before { content: '\f09b'; } /* '' */
|
||||
.icon-gauge:before { content: '\f0e4'; } /* '' */
|
||||
.icon-paper-plane-empty:before { content: '\f1d9'; } /* '' */
|
||||
|
Binary file not shown.
@ -36,6 +36,8 @@
|
||||
|
||||
<glyph glyph-name="help-circled" unicode="" d="M500 82v107q0 8-5 13t-13 5h-107q-8 0-13-5t-5-13v-107q0-8 5-13t13-5h107q8 0 13 5t5 13z m143 375q0 49-31 91t-77 65-95 23q-136 0-207-119-9-13 4-24l74-55q4-4 10-4 9 0 14 7 30 38 48 51 19 14 48 14 27 0 48-15t21-33q0-21-11-34t-38-25q-35-15-65-48t-29-70v-20q0-8 5-13t13-5h107q8 0 13 5t5 13q0 10 12 27t30 28q18 10 28 16t25 19 25 27 16 34 7 45z m214-107q0-117-57-215t-156-156-215-58-216 58-155 156-58 215 58 215 155 156 216 58 215-58 156-156 57-215z" horiz-adv-x="857.1" />
|
||||
|
||||
<glyph glyph-name="terminal" unicode="" d="M929 779h-858c-39 0-71-32-71-72v-714c0-40 32-72 71-72h858c39 0 71 32 71 72v714c0 40-32 72-71 72z m-786-500l143 142-143 143 71 72 215-215-215-214-71 72z m571-72h-285v72h285v-72z" horiz-adv-x="1000" />
|
||||
|
||||
<glyph glyph-name="github-circled" unicode="" d="M429 779q116 0 215-58t156-156 57-215q0-140-82-252t-211-155q-15-3-22 4t-7 17q0 1 0 43t0 75q0 54-29 79 32 3 57 10t53 22 45 37 30 58 11 84q0 67-44 115 21 51-4 114-16 5-46-6t-51-25l-21-13q-52 15-107 15t-108-15q-8 6-23 15t-47 22-47 7q-25-63-5-114-44-48-44-115 0-47 12-83t29-59 45-37 52-22 57-10q-21-20-27-58-12-5-25-8t-32-3-36 12-31 35q-11 18-27 29t-28 14l-11 1q-12 0-16-2t-3-7 5-8 7-6l4-3q12-6 24-21t18-29l6-13q7-21 24-34t37-17 39-3 31 1l13 3q0-22 0-50t1-30q0-10-8-17t-22-4q-129 43-211 155t-82 252q0 117 58 215t155 156 216 58z m-267-616q2 4-3 7-6 1-8-1-1-4 4-7 5-3 7 1z m18-19q4 3-1 9-6 5-9 2-4-3 1-9 5-6 9-2z m16-25q6 4 0 11-4 7-9 3-5-3 0-10t9-4z m24-23q4 4-2 10-7 7-11 2-5-5 2-11 6-6 11-1z m32-14q1 6-8 9-8 2-10-4t7-9q8-3 11 4z m35-3q0 7-10 6-9 0-9-6 0-7 10-6 9 0 9 6z m32 5q-1 7-10 5-9-1-8-8t10-4 8 7z" horiz-adv-x="857.1" />
|
||||
|
||||
<glyph glyph-name="gauge" unicode="" d="M214 207q0 30-21 51t-50 21-51-21-21-51 21-50 51-21 50 21 21 50z m107 250q0 30-20 51t-51 21-50-21-21-51 21-50 50-21 51 21 20 50z m239-268l57 213q3 14-5 27t-21 16-27-3-17-22l-56-213q-33-3-60-25t-35-55q-11-43 11-81t66-50 81 11 50 66q9 33-4 65t-40 51z m369 18q0 30-21 51t-51 21-50-21-21-51 21-50 50-21 51 21 21 50z m-358 357q0 30-20 51t-51 21-50-21-21-51 21-50 50-21 51 21 20 50z m250-107q0 30-20 51t-51 21-50-21-21-51 21-50 50-21 51 21 20 50z m179-250q0-145-79-269-10-17-30-17h-782q-20 0-30 17-79 123-79 269 0 102 40 194t106 160 160 107 194 39 194-39 160-107 106-160 40-194z" horiz-adv-x="1000" />
|
||||
|
Before Width: | Height: | Size: 9.5 KiB After Width: | Height: | Size: 9.8 KiB |
Binary file not shown.
Binary file not shown.
Binary file not shown.
13
routes/nojs.js
Normal file
13
routes/nojs.js
Normal file
@ -0,0 +1,13 @@
|
||||
const routes = require('express').Router()
|
||||
const uploadController = require('../controllers/uploadController')
|
||||
|
||||
routes.get('/nojs', async (req, res, next) => {
|
||||
return res.render('nojs', { layout: false })
|
||||
})
|
||||
|
||||
routes.post('/nojs', (req, res, next) => {
|
||||
req.params.nojs = true
|
||||
return uploadController.upload(req, res, next)
|
||||
})
|
||||
|
||||
module.exports = routes
|
167
views/nojs.handlebars
Normal file
167
views/nojs.handlebars
Normal file
@ -0,0 +1,167 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
|
||||
<meta charset="utf-8" />
|
||||
<meta name="description" content="A pomf-like file uploading service that doesn't suck.">
|
||||
<meta name="keywords" content="upload,lolisafe,file,images,hosting,bobby,fiery">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
|
||||
<title>safe.fiery.me – A small safe worth protecting.</title>
|
||||
|
||||
<!-- Stylesheets and scripts -->
|
||||
<link rel="stylesheet" type="text/css" href="libs/bulma/bulma.min.css?v=vvtL7Y3cjD">
|
||||
<link rel="stylesheet" type="text/css" href="libs/fontello/fontello.css?v=cjjyPrikAR">
|
||||
<link rel="stylesheet" type="text/css" href="css/style.css?v=vvtL7Y3cjD">
|
||||
|
||||
<!-- Open Graph tags -->
|
||||
<meta property="og:type" content="website" />
|
||||
<meta property="og:title" content="safe.fiery.me – A small safe worth protecting." />
|
||||
<meta property="og:url" content="https://safe.fiery.me/" />
|
||||
<meta property="og:description" content="A pomf-like file uploading service that doesn't suck." />
|
||||
<meta property="og:image" content="https://safe.fiery.me/icons/600px.png" />
|
||||
<meta property="og:image:width" content="600" />
|
||||
<meta property="og:image:height" content="600" />
|
||||
<meta property="og:image" content="https://safe.fiery.me/images/fb_share.png" />
|
||||
<meta property="og:image:width" content="1200" />
|
||||
<meta property="og:image:height" content="630" />
|
||||
<meta property="og:locale" content="en_US" />
|
||||
|
||||
<!-- Twitter Card tags -->
|
||||
<meta name="twitter:card" content="summary">
|
||||
<meta name="twitter:title" content="safe.fiery.me – A small safe worth protecting.">
|
||||
<meta name="twitter:description" content="A pomf-like file uploading service that doesn't suck.">
|
||||
<meta name="twitter:image" content="https://safe.fiery.me/icons/600px.png">
|
||||
|
||||
<!-- Icons and configs -->
|
||||
<link rel="icon" type="image/png" href="https://safe.fiery.me/icons/32pxr.png" sizes="32x32">
|
||||
<link rel="icon" type="image/png" href="https://safe.fiery.me/icons/96pxr.png" sizes="96x96">
|
||||
<link rel="apple-touch-icon" href="https://safe.fiery.me/icons/120px.png" sizes="120x120">
|
||||
<link rel="apple-touch-icon" href="https://safe.fiery.me/icons/152px.png" sizes="152x152">
|
||||
<link rel="apple-touch-icon" href="https://safe.fiery.me/icons/167px.png" sizes="167x167">
|
||||
<link rel="apple-touch-icon" href="https://safe.fiery.me/icons/180px.png" sizes="180x180">
|
||||
<link rel="manifest" href="https://safe.fiery.me/icons/manifest.json?v=V2RnA3Mwhh">
|
||||
<meta name="apple-mobile-web-app-title" content="safe.fiery.me">
|
||||
<meta name="application-name" content="safe.fiery.me">
|
||||
<meta name="msapplication-config" content="https://safe.fiery.me/icons/browserconfig.xml?v=V2RnA3Mwhh">
|
||||
<meta name="theme-color" content="#232629">
|
||||
|
||||
<style>
|
||||
#form input {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
#links {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
#links a {
|
||||
display: block;
|
||||
margin: 5px;
|
||||
}
|
||||
</style>
|
||||
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
<section class="hero is-fullheight has-text-centered" id="home">
|
||||
<div class="hero-body section">
|
||||
<div class="container">
|
||||
<p id="b">
|
||||
<img class="logo" src="images/logo_smol.png">
|
||||
</p>
|
||||
<h1 class="title">safe.fiery.me</h1>
|
||||
<h2 class="subtitle">A
|
||||
<strong>modern</strong> self-hosted file upload service</h2>
|
||||
|
||||
<div class="columns">
|
||||
<div class="column is-hidden-mobile"></div>
|
||||
<div class="column">
|
||||
<div class="content">
|
||||
<form id="form" action="" method="post" enctype="multipart/form-data">
|
||||
<div class="field">
|
||||
<input type="file" name="files[]" multiple="multiple">
|
||||
</div>
|
||||
<div class="field">
|
||||
<input type="submit" class="button is-danger" value="Upload">
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
<div class="content">
|
||||
<p>Files uploaded through this No JS form will not be associated to your account, if you have any.</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="column is-hidden-mobile"></div>
|
||||
</div>
|
||||
|
||||
{{#if files}}
|
||||
<div id="uploads" style="display: block">
|
||||
{{#each files}}
|
||||
<div class="columns">
|
||||
<div class="column is-hidden-mobile"></div>
|
||||
<div class="column">
|
||||
{{#if this.image}}
|
||||
<img class="is-unselectable" style="max-width: 200px" src="{{ this.url }}">
|
||||
{{/if}}
|
||||
<p class="link">
|
||||
<a href="{{ this.url }}" target="_blank">{{{ this.url }}}</a>
|
||||
</p>
|
||||
</div>
|
||||
<div class="column is-hidden-mobile"></div>
|
||||
</div>
|
||||
{{/each}}
|
||||
</div>
|
||||
{{/if}}
|
||||
|
||||
<h3 id="links">
|
||||
<a href="https://fiery.me" title="Home">
|
||||
<span class="icon is-medium">
|
||||
<i class="icon-home icon-2x"></i>
|
||||
</span>
|
||||
</a>
|
||||
<a href="https://blog.fiery.me" title="Blog">
|
||||
<span class="icon is-medium">
|
||||
<i class="icon-archive icon-2x"></i>
|
||||
</span>
|
||||
</a>
|
||||
<a href="https://safe.fiery.me/sharex.txt" title="ShareX">
|
||||
<span class="icon is-medium">
|
||||
<i class="icon-sharex icon-2x"></i>
|
||||
</span>
|
||||
</a>
|
||||
<a href="https://chrome.google.com/webstore/detail/loli-safe-uploader/enkkmplljfjppcdaancckgilmgoiofnj" target="_blank" title="Chrome extension">
|
||||
<span class="icon is-medium">
|
||||
<i class="icon-chrome icon-2x"></i>
|
||||
</span>
|
||||
</a>
|
||||
<a href="https://github.com/BobbyWibowo/uguush/tree/lolisafe-kde" target="_blank" title="Bash uploader">
|
||||
<span class="icon is-medium">
|
||||
<i class="icon-terminal icon-2x"></i>
|
||||
</span>
|
||||
</a>
|
||||
<a href="faq" title="FAQ">
|
||||
<span class="icon is-medium">
|
||||
<i class="icon-help-circled icon-2x"></i>
|
||||
</span>
|
||||
</a>
|
||||
<a href="auth" title="Dashboard">
|
||||
<span class="icon is-medium">
|
||||
<i class="icon-gauge icon-2x"></i>
|
||||
</span>
|
||||
</a>
|
||||
<a href="https://github.com/BobbyWibowo/lolisafe" target="_blank" title="GitHub">
|
||||
<span class="icon is-medium">
|
||||
<i class="icon-github-circled icon-2x"></i>
|
||||
</span>
|
||||
</a>
|
||||
</h3>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
</body>
|
||||
</html>
|
Loading…
Reference in New Issue
Block a user