Compare commits

..
35 Commits
Author SHA1 Message Date
bot c6386eb794 Update build files. 2024-11-26 06:22:48 +00:00
retoor bad8e011ce Ffs.
RUpload build / Build (push) Successful in 1m5s
2024-11-26 07:21:23 +01:00
retoor 78874deb56 Ffs.
RUpload build / Build (push) Failing after 1m1s
2024-11-26 07:19:13 +01:00
retoor 0b958e3800 Ffs.
RUpload build / Build (push) Has been cancelled
2024-11-26 07:18:20 +01:00
retoor 49f69cb688 Ffs.
RUpload build / Build (push) Has been cancelled
2024-11-26 07:17:56 +01:00
bot 9600f64eb9 Update build files. 2024-11-26 06:12:00 +00:00
retoor ec489ab30f Ffs.
RUpload build / Build (push) Successful in 1m1s
2024-11-26 07:10:52 +01:00
bot 304d163464 Update build files. 2024-11-26 06:10:05 +00:00
retoor a51c3739c9 Update url.
RUpload build / Build (push) Successful in 1m9s
2024-11-26 07:08:50 +01:00
bot a7aabcd36f Update build files. 2024-11-26 06:08:25 +00:00
retoor 03c8fb02a7 Update url.
RUpload build / Build (push) Successful in 1m1s
2024-11-26 07:07:13 +01:00
bot 3ee5232f49 Update build files. 2024-11-26 06:01:31 +00:00
retoor fb2a733f4c Right.
RUpload build / Build (push) Successful in 1m13s
2024-11-26 07:00:11 +01:00
bot 85fe10b7cd Update build files. 2024-11-26 05:58:49 +00:00
retoor 235cdc628b Fixed typo.
RUpload build / Build (push) Successful in 1m2s
2024-11-26 06:57:41 +01:00
bot 8bfa141a85 Update build files. 2024-11-26 05:57:27 +00:00
retoor 36ef6d7e4d Fix upload url replacement.
RUpload build / Build (push) Successful in 59s
2024-11-26 06:56:21 +01:00
bot 9209e43b8b Update build files. 2024-11-26 05:52:14 +00:00
retoor 28300cb055 Added missing slash.
RUpload build / Build (push) Successful in 1m3s
2024-11-26 06:51:00 +01:00
bot a875616522 Update build files. 2024-11-26 05:50:08 +00:00
retoor 37b9907334 Minor snafu.
RUpload build / Build (push) Successful in 1m5s
2024-11-26 06:48:54 +01:00
bot d79664fdc5 Update build files. 2024-11-26 05:48:01 +00:00
retoor ad1243afb7 Not sure if this will work, hope it just falls back.
RUpload build / Build (push) Successful in 1m1s
2024-11-26 06:46:53 +01:00
bot d6d31a0500 Update build files. 2024-11-26 05:32:47 +00:00
retoor 983d4d668f Automatic upload folder creation if not exists.
RUpload build / Build (push) Successful in 1m2s
2024-11-26 06:31:32 +01:00
retoor 2f6ecfe06d Made upload path dynamic. 2024-11-26 06:31:32 +01:00
bot 254cb6004b Update build files. 2024-11-26 05:26:28 +00:00
retoor e0fcf53788 Update storage quota.
RUpload build / Build (push) Successful in 1m5s
2024-11-26 06:25:07 +01:00
bot 456e3c0823 Update build files. 2024-11-26 05:06:53 +00:00
retoor 5f518c8df7 Added upload directory contents to .gitignore.
RUpload build / Build (push) Successful in 1m14s
2024-11-26 06:05:24 +01:00
retoor 15869d6537 Removed uploads content 2024-11-26 06:04:50 +01:00
retoor 3bd46cb640 Created build server configuration. 2024-11-26 06:04:33 +01:00
retoor 1ed30e0d80 Updated readme. 2024-11-26 05:57:50 +01:00
retoor 67d91a42e5 Updated readme. 2024-11-26 05:57:12 +01:00
retoor 3e72ecab20 Initial commit 2024-11-26 04:34:46 +01:00
14 changed files with 40 additions and 87 deletions
+1 -1
View File
@@ -1,4 +1,4 @@
.history .history
.venv .venv
src/rupload/__pycache__ src/upload/__pycache__
uploads/* uploads/*
+4 -4
View File
@@ -5,10 +5,10 @@ Easiest file manager for your server made for public use.
It doesn't have captcha or whatsoever. It's designed for public use, as long the domain isn't listed in a search engine. It has a limitation for file size, that's it's only security. Rate limiting is in consideration. The default file size is 50Mb. The default storage quota for whole directory is 10Gb. Default config will prevent your server for heavy abuse. It doesn't have captcha or whatsoever. It's designed for public use, as long the domain isn't listed in a search engine. It has a limitation for file size, that's it's only security. Rate limiting is in consideration. The default file size is 50Mb. The default storage quota for whole directory is 10Gb. Default config will prevent your server for heavy abuse.
## Installation ## Installation
1. `make ensure_venv` ```
2. `make install` python3 -m venv .venv
3. `source ./.venv/bin/activate` ./venv/bin/python -m pip install .
4. `rupload.serve` (See parameters below. Running with default config using no parameters works too.) ```
## Usage ## Usage
```bash ```bash
Binary file not shown.
BIN
View File
Binary file not shown.
-1
View File
@@ -16,7 +16,6 @@ python_requires = >=3.7
install_requires = install_requires =
aiohttp==3.10.10 aiohttp==3.10.10
dataset==1.6.2 dataset==1.6.2
pillow
[options.packages.find] [options.packages.find]
where = src where = src
+5 -6
View File
@@ -1,4 +1,4 @@
Metadata-Version: 2.4 Metadata-Version: 2.1
Name: rupload Name: rupload
Version: 1.3.37 Version: 1.3.37
Summary: upload tool Summary: upload tool
@@ -9,7 +9,6 @@ Requires-Python: >=3.7
Description-Content-Type: text/markdown Description-Content-Type: text/markdown
Requires-Dist: aiohttp==3.10.10 Requires-Dist: aiohttp==3.10.10
Requires-Dist: dataset==1.6.2 Requires-Dist: dataset==1.6.2
Requires-Dist: pillow
# RUpload # RUpload
@@ -18,10 +17,10 @@ Easiest file manager for your server made for public use.
It doesn't have captcha or whatsoever. It's designed for public use, as long the domain isn't listed in a search engine. It has a limitation for file size, that's it's only security. Rate limiting is in consideration. The default file size is 50Mb. The default storage quota for whole directory is 10Gb. Default config will prevent your server for heavy abuse. It doesn't have captcha or whatsoever. It's designed for public use, as long the domain isn't listed in a search engine. It has a limitation for file size, that's it's only security. Rate limiting is in consideration. The default file size is 50Mb. The default storage quota for whole directory is 10Gb. Default config will prevent your server for heavy abuse.
## Installation ## Installation
1. `make ensure_venv` ```
2. `make install` python3 -m venv .venv
3. `source ./.venv/bin/activate` ./venv/bin/python -m pip install .
4. `rupload.serve` (See parameters below. Running with default config using no parameters works too.) ```
## Usage ## Usage
```bash ```bash
-1
View File
@@ -1,3 +1,2 @@
aiohttp==3.10.10 aiohttp==3.10.10
dataset==1.6.2 dataset==1.6.2
pillow
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+30 -72
View File
@@ -1,20 +1,16 @@
import pathlib import aiohttp
from aiohttp import web from aiohttp import web
import asyncio
MAX_FILE_SIZE = 1024 * 1024 * 300 # 50Mb import pathlib
UPLOAD_FOLDER_QUOTA = 10 * 1024 * 1024 * 1024 # 10Gb
UPLOAD_URL = "/"
UPLOAD_PATH = "uploads"
class Rupload(web.Application): class Rupload(web.Application):
def __init__( def __init__(
self, self,
upload_url: str = UPLOAD_URL, upload_url: str = "/uploads/",
upload_path: str = UPLOAD_PATH, upload_path: str = "uploads",
max_file_size: int = MAX_FILE_SIZE, max_file_size: int = 1024 * 1024 * 50,
upload_folder_quota: int = UPLOAD_FOLDER_QUOTA, upload_folder_quota: int = 10 * 1024 * 1024 * 1024,
): ):
self.upload_path = upload_path.rstrip("/") self.upload_path = upload_path.rstrip("/")
self.max_file_size = max_file_size self.max_file_size = max_file_size
@@ -35,22 +31,17 @@ UPLOAD_PAGE = """
<html lang="en"> <html lang="en">
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=0.9"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>RUpload 1.33.7</title> <title>File Upload</title>
<style> <style>
body { body {
font-family: "Courier New", Courier, monospace; font-family: Arial, sans-serif;
background-color: #111111; background-color: #f4f4f9;
display: flex; display: flex;
justify-content: center; justify-content: center;
align-items: center; align-items: center;
word-break: break-all;
margin: 0; margin: 0;
filter: invert(1);
}
a {
text-decoration: none;
} }
.container { .container {
@@ -61,10 +52,7 @@ UPLOAD_PAGE = """
width: 100%; width: 100%;
max-width: 500px; max-width: 500px;
} }
.container-images {
filter: invert(1);
}
h1 { h1 {
font-size: 24px; font-size: 24px;
margin-bottom: 20px; margin-bottom: 20px;
@@ -73,7 +61,6 @@ UPLOAD_PAGE = """
h2 { h2 {
font-size: 20px; font-size: 20px;
margin-top: 20px;
margin-bottom: 20px; margin-bottom: 20px;
color: #333; color: #333;
clear: both; clear: both;
@@ -123,9 +110,8 @@ UPLOAD_PAGE = """
width: 100px; width: 100px;
height: 100px; height: 100px;
object-fit: cover; object-fit: cover;
margin: 3px; margin: 10px;
float:left; float:left;
border-radius: 5px;
} }
</style> </style>
</head> </head>
@@ -140,9 +126,9 @@ UPLOAD_PAGE = """
<button type="submit">Upload</button> <button type="submit">Upload</button>
</form> </form>
<br /> <br />
Click <a href="#files">here</a> to see <a href="#files">uploaded files</a> (non-image) at the bottom of this page. Click <a href="#files">here</a> to see <a href="#files">uploaded files</a> (non-image) at the bottom of this page.<br />
<h2>Uploaded images:</h2> <h2>Uploaded images:</h2>
<div class="container-images"> <div class="container-image">
[images_html] [images_html]
</div> </div>
<h2 id="files">Uploaded files:</h2> <h2 id="files">Uploaded files:</h2>
@@ -174,14 +160,12 @@ def format_size(size):
def get_images(path): def get_images(path):
images = [] images = []
for image in pathlib.Path(path).iterdir(): for image in pathlib.Path(path).iterdir():
if image.is_file() and image.suffix.lower() in [ if image.is_file() and image.suffix in [
".png", ".png",
".jpg", ".jpg",
".gif", ".gif",
".jpeg", ".jpeg",
".bmp", ".bmp",
".webp",
".svg",
]: ]:
images.append(image) images.append(image)
return images return images
@@ -200,8 +184,7 @@ def create_images_html(url, image_paths):
images_html = "" images_html = ""
for image_path in image_paths: for image_path in image_paths:
path = url.rstrip("/") + "/" + image_path.name path = url.rstrip("/") + "/" + image_path.name
thumbnail_path = "/thumbnail/" + url.strip("/") + "/" + image_path.name images_html += f'<img class="thumbnail" src="{path}" alt="{image_path.name}">'
images_html += f'<a href="{path}"><img class="thumbnail" src="{thumbnail_path}" alt="{image_path.name}" /></a>\n'
return images_html return images_html
@@ -209,7 +192,7 @@ def create_files_html(url, file_paths):
files_html = "" files_html = ""
for file_path in file_paths: for file_path in file_paths:
path = url.rstrip("/") + "/" + file_path.name path = url.rstrip("/") + "/" + file_path.name
files_html += f'<a href="{path}">{file_path.name}</a> ({format_size(file_path.stat().st_size)})\n<br>\n' files_html += f'<a href="{path}">{file_path.name}</a> ({format_size(file_path.stat().st_size)})<br>'
return files_html return files_html
@@ -254,7 +237,9 @@ async def handle_upload(request: web.Request):
print(f"File {filename} deleted.") print(f"File {filename} deleted.")
return web.Response( return web.Response(
status=413, status=413,
text=f"File is too large. Maximum file size is {app.max_file_size} bytes.", text="File is too large. Maximum file size is {} bytes.".format(
app.max_file_size
),
) )
f.write(chunk) f.write(chunk)
print(f"File {filename} uploaded successfully.") print(f"File {filename} uploaded successfully.")
@@ -268,27 +253,6 @@ async def handle_upload(request: web.Request):
return web.Response(status=400, text="No file uploaded.") return web.Response(status=400, text="No file uploaded.")
async def handle_thumbnail(request: web.Request):
path = request.match_info["path"]
safe_path = pathlib.Path(request.app.upload_path).joinpath(pathlib.Path(path).name)
if not safe_path.is_file():
return web.Response(status=400, text="Invalid file type.")
thumbnail_path = pathlib.Path(request.app.upload_path).joinpath(".thumbnail").joinpath(pathlib.Path(safe_path).name)
if not thumbnail_path.parent.exists():
thumbnail_path.parent.mkdir(exist_ok=True,parents=False)
if not thumbnail_path.exists():
from PIL import Image
image = Image.open(safe_path)
image.thumbnail((200, 200))
image.save(thumbnail_path)
return web.FileResponse(thumbnail_path)
async def handle_index(request: web.Request): async def handle_index(request: web.Request):
image_paths = get_images(request.app.upload_path) image_paths = get_images(request.app.upload_path)
images_html = create_images_html( images_html = create_images_html(
@@ -302,14 +266,10 @@ async def handle_index(request: web.Request):
if request.app.is_upload_folder_quota_reached: if request.app.is_upload_folder_quota_reached:
message = "Server reached quota! Contact administrator." message = "Server reached quota! Contact administrator."
if "is available here: " in message: if "is available here: " in message:
url = message[message.find("here: ") + len("here: ") :] url = message[message.find("here: ") + len("here: "):]
message = message[: message.find("here: ") + len("here: ")] message = message[: message.find("here: ")+len("here: ")]
message += f'<a href="{url}">' message += f"<a href=\"{url}\">"
message += f"{url}</a>" message += f"{url}</a>"
if not message:
message = (
"Any file type is allowed thus also binary/executable or source files."
)
if message: if message:
message += "<br /><br />" message += "<br /><br />"
html_content = html_content.replace("[message]", message) html_content = html_content.replace("[message]", message)
@@ -317,10 +277,10 @@ async def handle_index(request: web.Request):
def create_app( def create_app(
upload_url: str = UPLOAD_URL, upload_url: str = "/",
upload_path: str = UPLOAD_PATH, upload_path: str = "upload",
max_file_size: int = MAX_FILE_SIZE, max_file_size: int = 1024 * 1024 * 50,
upload_folder_quota: int = UPLOAD_FOLDER_QUOTA, upload_folder_quota: int = 10 * 1024 * 1024 * 1024,
): ):
app = Rupload( app = Rupload(
upload_url=upload_url, upload_url=upload_url,
@@ -330,12 +290,10 @@ def create_app(
) )
pathlib.Path(upload_path).mkdir(parents=True, exist_ok=True) pathlib.Path(upload_path).mkdir(parents=True, exist_ok=True)
app.add_routes( app.add_routes(
[ [
web.get("/", handle_index), web.get("/", handle_index),
web.post("/upload", handle_upload), web.post("/upload", handle_upload),
web.static("/", upload_path), web.static("/", upload_path),
web.get("/thumbnail/{path:.*}", handle_thumbnail),
web.static("/uploads", upload_path),
] ]
) )
return app return app
-2
View File
@@ -1,7 +1,5 @@
import argparse import argparse
from aiohttp import web from aiohttp import web
from rupload.app import create_app from rupload.app import create_app