157 lines
6.3 KiB
Plaintext
157 lines
6.3 KiB
Plaintext
{% extends 'layouts/base.njk' %}
|
|
|
|
{% set title = app.name + ' - File upload' %}
|
|
|
|
{% block scripts %}
|
|
<script src="/js/fm.js"></script>
|
|
{% endblock %}
|
|
|
|
{% block body %}
|
|
<h1>Upload files</h1>
|
|
<p>(except illegal ones)</p>
|
|
|
|
<div class="container">
|
|
<section class="panel">
|
|
<h2>Upload a file</h2>
|
|
|
|
<form action="{{ route('post-file-frontend') }}" method="POST" enctype="multipart/form-data"
|
|
id="upload-form">
|
|
{{ macros.field(_locals, 'file', 'upload', '', 'Choose wisely', 'The maximum upload size is ' + max_upload_size + 'MiB', validation_attributes='required') }}
|
|
|
|
{{ macros.field(_locals, 'number', 'expire_after_days', '30', 'How many days to delete this file after', null, validation_attributes='max="1825"') }}
|
|
{{ macros.field(_locals, 'checkbox', 'never_expire', '', 'Never delete this file') }}
|
|
|
|
{{ macros.field(_locals, 'text', 'slug', '', 'Custom url slug', 'Example: beautiful_image.jpg sets url to https://ily.li/beautiful_image.jpg', validation_attributes='disabled') }}
|
|
{{ macros.field(_locals, 'checkbox', 'autogen_url', '', 'Generate url automatically', null, validation_attributes='checked') }}
|
|
|
|
{{ macros.csrf(getCSRFToken) }}
|
|
|
|
<button type="submit"><i data-feather="upload"></i> Upload</button>
|
|
</form>
|
|
|
|
<div id="file-upload" class="hidden">
|
|
<div class="name">photo.jpg</div>
|
|
<div class="progress-bar" style="--progress: 50%;"><span class="content">50%</span></div>
|
|
<div class="status hidden"></div>
|
|
</div>
|
|
|
|
<div id="file-upload-link" class="hidden copyable-text">
|
|
<div class="title">URL</div>
|
|
<div class="content"></div>
|
|
<button class="copy-button"><i data-feather="copy"></i></button>
|
|
</div>
|
|
</section>
|
|
|
|
<section class="panel">
|
|
<h2>Setup a desktop utility</h2>
|
|
<p>There may be a desktop client at some point. For now, if you're an advanced user, you can setup
|
|
scripts/macros.</p>
|
|
|
|
<hr>
|
|
<section>
|
|
<h3>First alternative: sh script (native on linux)</h3>
|
|
<p>If you have the sh shell on your machine (i.e. you are on linux, git bash on windows...), you can
|
|
<a href="{{ route('linux-script') }}">download this script</a>.</p>
|
|
<p>You must put a valid auth token (generated in the form at the bottom of this page) in a .ily_token file in your home directory ($HOME/.ily_token).</p>
|
|
<p>Examples:</p>
|
|
<pre>upload_script.sh path/to/file</pre>
|
|
<pre>upload_script.sh path/to/file my_very_important_file.png</pre>
|
|
</section>
|
|
|
|
<hr>
|
|
|
|
<section>
|
|
<h3>Second alternative: implement your own client</h3>
|
|
<p>
|
|
To upload the file, you must:
|
|
</p>
|
|
<ul>
|
|
<li>Set the "Authorization" HTTP header to an auth token (generate one with the form below)</li>
|
|
<li>Make a proper file upload request either with the method "POST" on / (auto-generates a short
|
|
url) or "PUT" (choose the target url you want, alphanum)
|
|
</li>
|
|
</ul>
|
|
<table class="data-table">
|
|
<thead>
|
|
<tr>
|
|
<th>Field name</th>
|
|
<th>Description</th>
|
|
<th>Optional?</th>
|
|
<th>Example</th>
|
|
</tr>
|
|
</thead>
|
|
|
|
<tbody>
|
|
<tr>
|
|
<td>upload</td>
|
|
<td>The file field</td>
|
|
<td>No</td>
|
|
<td>-</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td>ttl</td>
|
|
<td>How much time (in seconds) to keep the file</td>
|
|
<td>Yes</td>
|
|
<td>0 (never delete), 30 (delete after 30s)</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<p>Example with curl:</p>
|
|
<pre>curl -X POST -H 'Accept: application/json' \
|
|
-H "Authorization: very_secret_and_personal_token" \
|
|
-F 'upload=@path/to/local/file' \
|
|
https://ily.li/</pre>
|
|
<pre>curl -X PUT -H 'Accept: application/json' \
|
|
-H "Authorization: very_secret_and_personal_token" \
|
|
-F 'upload=@path/to/local/file' \
|
|
https://ily.li/my_very_important_file.png</pre>
|
|
<pre>curl -X POST -H 'Accept: application/json' \
|
|
-H "Authorization: very_secret_and_personal_token" \
|
|
-F 'upload=@path/to/local/file' \
|
|
-F 'ttl=30' \
|
|
https://ily.li/</pre>
|
|
</section>
|
|
</section>
|
|
</div>
|
|
|
|
<section class="panel">
|
|
<h2>Auth tokens</h2>
|
|
<form action="{{ route('generate-token') }}" method="POST">
|
|
{{ macros.csrf(getCSRFToken) }}
|
|
|
|
<button type="submit"><i data-feather="plus"></i> Generate a new token</button>
|
|
</form>
|
|
|
|
<table class="data-table">
|
|
<thead>
|
|
<tr>
|
|
<th>#</th>
|
|
<th>Secret</th>
|
|
<th>Created at</th>
|
|
<th>Last used at</th>
|
|
<th>Actions</th>
|
|
</tr>
|
|
</thead>
|
|
|
|
<tbody>
|
|
{% for token in auth_tokens %}
|
|
<tr>
|
|
<td>{{ token.id }}</td>
|
|
<td>
|
|
<div class="copyable-text">
|
|
<div class="content">{{ token.secret }}</div>
|
|
<button class="copy-button"><i data-feather="copy"></i></button>
|
|
</div>
|
|
</td>
|
|
<td>{{ token.created_at.toISOString() }}</td>
|
|
<td>{{ token.used_at.toISOString() }}</td>
|
|
<td>
|
|
<a href="{{ route('revoke-token', token.id) }}" class="button danger"><i data-feather="trash"></i> Revoke</a>
|
|
</td>
|
|
</tr>
|
|
{% endfor %}
|
|
</tbody>
|
|
</table>
|
|
</section>
|
|
{% endblock %} |