13 Commits
v2.1.3 ... v2.3

6 changed files with 120 additions and 24 deletions

7
.github/README.md vendored Normal file
View File

@ -0,0 +1,7 @@
# imgupload
## Moving from GitHub to Gitea
**TL;DR: Please go to my Gitea instance instead of GitHub for anything related to imgupload. [https://git.bbaovanc.com/bbaovanc/imgupload](https://git.bbaovanc.com/bbaovanc/imgupload)**
This repository might not exist on GitHub in the future! Releases will not be released here in the future. Instead, they will be released on the repository on my Gitea instance, which you can find [here](https://git.bbaovanc.com/bbaovanc/imgupload). Issues and pull requests should also be created on Gitea. For now, commits will still be pushed to this repository, but that may change in the future.

View File

@ -1,26 +1,87 @@
# imgupload # imgupload
![CodeFactor Grade](https://img.shields.io/codefactor/grade/github/BBaoVanC/imgupload/master?color=purple) ![GitHub repo size](https://img.shields.io/github/repo-size/bbaovanc/imgupload?color=purple) ![GitHub All Releases](https://img.shields.io/github/downloads/bbaovanc/imgupload/total?color=purple) ![GitHub issues](https://img.shields.io/github/issues/bbaovanc/imgupload?color=purple) ![GitHub closed issues](https://img.shields.io/github/issues-closed/bbaovanc/imgupload?color=purple) ![GitHub](https://img.shields.io/github/license/bbaovanc/imgupload?color=purple)
### What is imgupload? <!---![CodeFactor Grade](https://img.shields.io/codefactor/grade/github/BBaoVanC/imgupload/master?color=purple)
![GitHub repo size](https://img.shields.io/github/repo-size/bbaovanc/imgupload?color=purple)
![GitHub All Releases](https://img.shields.io/github/downloads/bbaovanc/imgupload/total?color=purple)
![GitHub issues](https://img.shields.io/github/issues/bbaovanc/imgupload?color=purple)
![GitHub closed issues](https://img.shields.io/github/issues-closed/bbaovanc/imgupload?color=purple)
![GitHub](https://img.shields.io/github/license/bbaovanc/imgupload?color=purple)-->
## What is imgupload?
imgupload is a Flask + uWSGI application to serve as an all-purpose image/file uploader over POST requests. imgupload is a Flask + uWSGI application to serve as an all-purpose image/file uploader over POST requests.
### Installation ---
1. Clone the repository: `git clone https://github.com/BBaoVanC/imgupload.git`
2. Enter the imgupload directory: `cd imgupload` ## FAQ
3. Create a virtualenv: `python3 -m venv env`
4. Enter the virtualenv: `source env/bin/activate` **Where can I send bug reports and feature requests?**
5. Install dependencies: `python3 -m pip install -r requirements.txt`
6. Run the Flask app You can create an issue [here](https://git.bbaovanc.com/bbaovanc/imgupload/issues).
**How do I use this program?**
See [Installation](#installation)
**I want to make a pull request. Where should I do that?**
First, fork [this repository](https://git.bbaovanc.com/bbaovanc/imgupload). If you don't have an account on my Gitea site yet, you can either create one, or sign in using your GitHub account. Commit your changes to your fork, and then create a pull request.
---
## Installation
## Running the Flask app
### Using uWSGI ### Using uWSGI
[https://uwsgi-docs.readthedocs.io/en/latest/Configuration.html](https://uwsgi-docs.readthedocs.io/en/latest/Configuration.html)
Instructions specific to imgupload are coming soon Note: replace `www-data` with whatever user your webserver runs as.
1. Make /srv/imgupload: `sudo mkdir /srv/imgupload`
2. Change ownership of /srv/imgupload: `sudo chown www-data:www-data /srv/imgupload`
3. Enter www-data user: `sudo su www-data`
4. Change directories to /srv/imgupload: `cd /srv/imgupload`
5. Clone the repository: `git clone https://git.bbaovanc.com/bbaovanc/imgupload.git`
6. Enter the imgupload directory: `cd imgupload`
7. Create a virtualenv: `python3 -m venv env`
8. Enter the virtualenv: `source env/bin/activate`
9. Install dependencies: `python3 -m pip install -r requirements.txt`
10. Leave the www-data user: `exit`
11. Copy the default uWSGI configuration: `sudo cp /srv/imgupload/uwsgi.ini.default /etc/uwsgi/apps-available/imgupload.ini`
12. Modify `/etc/uwsgi/apps-available/imgupload.ini` to your preferences
13. Enable imgupload: `sudo ln -s /etc/uwsgi/apps-available/imgupload.ini /etc/uwsgi/apps-enabled/`
14. Restart uWSGI: `sudo systemctl restart uwsgi`
15. Set up your webserver to proxy the uwsgi.sock
Example NGINX location block:
```nginx
location /upload {
include uwsgi_params;
uwsgi_pass unix:/srv/imgupload/uwsgi.sock;
client_max_body_size 25M;
}
```
### Using Flask development server ### Using Flask development server
#### Setup
```shell
$ git clone https://git.bbaovanc.com/bbaovanc/imgupload.git
$ cd imgupload
$ python3 -m venv env
$ source env/bin/activate
$ pip3 install -r requirements.txt
```
#### Run
```shell ```shell
$ source env/bin/activate # if you haven't already entered the virtualenv
$ export FLASK_APP=imgupload.py $ export FLASK_APP=imgupload.py
$ flask run $ flask run
``` ```
---
## License
_imgupload_ is licensed under the GPLv3 license. For more information, please refer to [`LICENSE`](https://git.bbaovanc.com/bbaovanc/imgupload/src/branch/master/LICENSE)

View File

@ -4,6 +4,7 @@ configtest.py
Tests the validity of your configuration in settings.py. Tests the validity of your configuration in settings.py.
""" """
import os import os
import settings as settings import settings as settings
@ -84,8 +85,6 @@ if "ROOTURL" in checksettings:
pass pass
else: else:
rooturl_good = False rooturl_good = False
print(settings.ROOTURL)
print(settings.ROOTURL.startswith("https://"))
print("[!] ROOTURL does not start with `http://` or `https://`! This may cause issues!") print("[!] ROOTURL does not start with `http://` or `https://`! This may cause issues!")
if not settings.ROOTURL.endswith("/"): if not settings.ROOTURL.endswith("/"):
rooturl_good = False rooturl_good = False

View File

@ -4,6 +4,7 @@ functions.py
Functions used by imgupload which can be easily customized. Functions used by imgupload which can be easily customized.
""" """
import string import string
import random import random

View File

@ -4,6 +4,7 @@ imgupload.py
Flask application for processing images uploaded through POST requests. Flask application for processing images uploaded through POST requests.
""" """
from flask import Flask, request, jsonify, Response from flask import Flask, request, jsonify, Response
from flask_api import status from flask_api import status
from pathlib import Path from pathlib import Path
@ -17,7 +18,7 @@ app = Flask(__name__) # app is the app
def allowed_extension(testext): def allowed_extension(testext):
if testext in settings.ALLOWED_EXTENSIONS: if testext.lower() in settings.ALLOWED_EXTENSIONS:
return True return True
else: else:
return False return False
@ -49,6 +50,11 @@ def upload():
if request.form["uploadKey"] in validkeys: # check if uploadKey is valid if request.form["uploadKey"] in validkeys: # check if uploadKey is valid
print("Key is valid!") print("Key is valid!")
if "verify" in request.form.keys():
if request.form["verify"] == "true":
print("Request is asking if key is valid (it is)")
return jsonify({'status': 'key_valid'})
if "imageUpload" in request.files: # check if image to upload was provided if "imageUpload" in request.files: # check if image to upload was provided
f = request.files["imageUpload"] # f is the image to upload f = request.files["imageUpload"] # f is the image to upload
else: else:
@ -61,12 +67,27 @@ def upload():
fext = Path(f.filename).suffix # get the uploaded extension fext = Path(f.filename).suffix # get the uploaded extension
if allowed_extension(fext): # if the extension is allowed if allowed_extension(fext): # if the extension is allowed
print("Generating file with extension {0}".format(fext)) if not "imageName" in request.form.keys():
fname = functions.generate_name() + fext # generate file name print("Generating file with extension {0}".format(fext))
print("Generated name: {0}".format(fname)) fname = functions.generate_name() + fext # generate file name
print("Generated name: {0}".format(fname))
else:
fname = request.form["imageName"]
if len(fname) > 0:
print("Request imageName: {0}".format(fname))
if not fname.lower().endswith(fext.lower()): # if requested name doesn't have the correct extension
fname += fext # add the extension
print("Added extension; new filename: {0}".format(fname))
else:
print("Requested filename is blank!")
fname = functions.generate_name() + fext # generate a valid filename
print("Generated name: {0}".format(fname))
if f: # if the uploaded image exists if f: # if the uploaded image exists
print("Uploaded image exists") print("Uploaded image exists")
if Path(os.path.join(settings.UPLOAD_FOLDER, fname)).is_file():
print("Requested filename already exists!")
return jsonify({'status': 'error', 'error': 'FILENAME_TAKEN'}), status.HTTP_409_CONFLICT
f.save(os.path.join(settings.UPLOAD_FOLDER, fname)) # save the image f.save(os.path.join(settings.UPLOAD_FOLDER, fname)) # save the image
print("Saved to {0}".format(fname)) print("Saved to {0}".format(fname))
url = settings.ROOTURL + fname # construct the url to the image url = settings.ROOTURL + fname # construct the url to the image
@ -92,10 +113,5 @@ def upload():
print("No uploadKey found in request!") print("No uploadKey found in request!")
return jsonify({'status': 'error', 'error': 'UNAUTHORIZED'}), status.HTTP_401_UNAUTHORIZED return jsonify({'status': 'error', 'error': 'UNAUTHORIZED'}), status.HTTP_401_UNAUTHORIZED
else: # if the request method wasn't post
print("Request method was not POST!")
return jsonify({'status': 'error', 'error': 'METHOD_NOT_ALLOWED'}), status.HTTP_405_METHOD_NOT_ALLOWED
if __name__ == "__main__": if __name__ == "__main__":
print("Run with `flask` or a WSGI server!") print("Run with `flask` or a WSGI server!")

12
uwsgi.ini.default Normal file
View File

@ -0,0 +1,12 @@
[uwsgi]
socket = /srv/imgupload/uwsgi.sock
chmod-socket = 755
chdir = /srv/imgupload
venv = /srv/imgupload/env
master = true
module = imgupload:app
processes = 10
threads = 1
uid = www-data
gid = www-data
plugins = python3,logfile