Add upload_file.sh and update file-upload view accordingly

This commit is contained in:
Alice Gaudon 2020-06-27 17:50:28 +02:00
parent 669325d029
commit 36105e86a5
3 changed files with 78 additions and 39 deletions

18
assets/files/upload_file.sh Executable file
View File

@ -0,0 +1,18 @@
#!/bin/sh
local_file=$1
token=$(cat $HOME/.ily_token)
if test -z "$2"; then
curl -X POST -H 'Accept: text/plain' \
-H "Authorization: $token" \
-F 'upload=@'$local_file \
-F 'ttl=2592000' \
https://ily.li/
else
curl -X PUT -H 'Accept: text/plain' \
-H "Authorization: $token" \
-F 'upload=@'$local_file \
-F 'ttl=2592000' \
"https://ily.li/$2"
fi

View File

@ -15,6 +15,7 @@ const SLUG_DICTIONARY = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ012
export default class FileController extends Controller { export default class FileController extends Controller {
routes(): void { routes(): void {
this.get('/files/upload', this.getFileUploader, 'file-upload', REQUIRE_AUTH_MIDDLEWARE); this.get('/files/upload', this.getFileUploader, 'file-upload', REQUIRE_AUTH_MIDDLEWARE);
this.get('/files/upload/script', this.downloadLinuxScript, 'linux-script');
this.post('/files/post', this.postFileFrontend, 'post-file-frontend', REQUIRE_AUTH_MIDDLEWARE, FILE_UPLOAD_FORM_MIDDLEWARE); this.post('/files/post', this.postFileFrontend, 'post-file-frontend', REQUIRE_AUTH_MIDDLEWARE, FILE_UPLOAD_FORM_MIDDLEWARE);
this.get('/files/:page([0-9]+)?', this.getFileManager, 'file-manager', REQUIRE_AUTH_MIDDLEWARE); this.get('/files/:page([0-9]+)?', this.getFileManager, 'file-manager', REQUIRE_AUTH_MIDDLEWARE);
this.get('/files/delete/:slug', this.deleteFile, 'delete-file-frontend', REQUIRE_AUTH_MIDDLEWARE); this.get('/files/delete/:slug', this.deleteFile, 'delete-file-frontend', REQUIRE_AUTH_MIDDLEWARE);
@ -34,6 +35,10 @@ export default class FileController extends Controller {
}); });
} }
protected async downloadLinuxScript(req: Request, res: Response): Promise<void> {
res.download('assets/files/upload_file.sh', 'upload_file.sh');
}
protected async getFileManager(req: Request, res: Response): Promise<void> { protected async getFileManager(req: Request, res: Response): Promise<void> {
res.render('file-manager', { res.render('file-manager', {
files: await FileModel.paginateForUser(req, 100, req.models.user!.id!), files: await FileModel.paginateForUser(req, 100, req.models.user!.id!),

View File

@ -46,55 +46,72 @@
<h2>Setup a desktop utility</h2> <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 <p>There may be a desktop client at some point. For now, if you're an advanced user, you can setup
scripts/macros.</p> scripts/macros.</p>
<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> <hr>
<tr> <section>
<td>upload</td> <h3>First alternative: sh script (native on linux)</h3>
<td>The file field</td> <p>If you have the sh shell on your machine (i.e. you are on linux, git bash on windows...), you can
<td>No</td> <a href="{{ route('linux-script') }}">download this script</a>.</p>
<td>-</td> <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>
</tr> <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>
<tr> <hr>
<td>ttl</td>
<td>How much time (in seconds) to keep the file</td> <section>
<td>Yes</td> <h3>Second alternative: implement your own client</h3>
<td>0 (never delete), 30 (delete after 30s)</td> <p>
</tr> To upload the file, you must:
</tbody> </p>
</table> <ul>
<p>Example with curl:</p> <li>Set the "Authorization" HTTP header to an auth token (generate one with the form below)</li>
<pre>curl -X POST -H 'Accept: application/json' \ <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" \ -H "Authorization: very_secret_and_personal_token" \
-F 'upload=@path/to/local/file' \ -F 'upload=@path/to/local/file' \
https://ily.li/</pre> https://ily.li/</pre>
<pre>curl -X PUT -H 'Accept: application/json' \ <pre>curl -X PUT -H 'Accept: application/json' \
-H "Authorization: very_secret_and_personal_token" \ -H "Authorization: very_secret_and_personal_token" \
-F 'upload=@path/to/local/file' \ -F 'upload=@path/to/local/file' \
https://ily.li/my_very_important_file.png</pre> https://ily.li/my_very_important_file.png</pre>
<pre>curl -X POST -H 'Accept: application/json' \ <pre>curl -X POST -H 'Accept: application/json' \
-H "Authorization: very_secret_and_personal_token" \ -H "Authorization: very_secret_and_personal_token" \
-F 'upload=@path/to/local/file' \ -F 'upload=@path/to/local/file' \
-F 'ttl=30' \ -F 'ttl=30' \
https://ily.li/</pre> https://ily.li/</pre>
</section>
</section> </section>
</div> </div>
@ -130,8 +147,7 @@ https://ily.li/</pre>
<td>{{ token.created_at.toISOString() }}</td> <td>{{ token.created_at.toISOString() }}</td>
<td>{{ token.used_at.toISOString() }}</td> <td>{{ token.used_at.toISOString() }}</td>
<td> <td>
<a href="{{ route('revoke-token', token.id) }}" class="button danger"><i <a href="{{ route('revoke-token', token.id) }}" class="button danger"><i data-feather="trash"></i> Revoke</a>
data-feather="trash"></i> Revoke</a>
</td> </td>
</tr> </tr>
{% endfor %} {% endfor %}