Compare commits

..

75 Commits

Author SHA1 Message Date
fc2ccfae4a
Dump version v0.5.0 2018-11-12 00:10:56 +01:00
6e3bda752d
Fix image 2018-11-11 23:50:27 +01:00
052f857f17
Add image 2018-11-11 23:47:09 +01:00
f9defce223
Fix some upload with browsers 2018-11-11 23:45:18 +01:00
bf82c1b95e
Upgrade some doc and version 2018-11-06 00:24:02 +01:00
18cad618d6
Update to compile with crystal v0.27.0 2018-11-06 00:22:51 +01:00
4e3f08603f
Update README 2018-10-29 00:48:13 +01:00
7e4fec1569
Bump version v0.4.1 2018-10-28 22:40:53 +01:00
4288e89283
Update kemalcr and crystal 2018-10-28 22:40:08 +01:00
00b04e865e
Update version to 0.4.0 2017-12-30 01:06:48 +01:00
0a90603c93
Fix christmas 2017-12-30 01:06:16 +01:00
b41731427b
Update with crystal v0.24.1 2017-12-30 01:05:23 +01:00
532f226032
Update README 2017-12-26 19:30:24 +01:00
a27abbe661
Improve makefile with NAME configurable 2017-12-26 19:27:26 +01:00
d21502b068 Add install/uninstall rules 2017-12-26 12:39:47 +01:00
e5d620b676
Upgrade to version 0.3.2 2017-10-27 00:58:27 +02:00
bb9787099a
Add TRANSFER_SSL_ENABLED 2017-10-27 00:57:36 +02:00
bb6ccfa96d
Upgrade to version 0.3.2 2017-10-27 00:49:08 +02:00
cc58c840c7
Add auto-detect host and port of the server (by request) 2017-10-27 00:48:29 +02:00
a3080917d9
Add 500 http status 2017-10-27 00:17:11 +02:00
891bd9cf87
Factorize file upload and fix error details leak 2017-10-27 00:15:57 +02:00
28a646d83d
Fix image in the readme 2017-10-26 13:24:54 +02:00
8b0f5c8364
Add image in the readme 2017-10-26 13:23:17 +02:00
21d222848c
Improve upload form 2017-10-26 13:18:16 +02:00
e8829db154
Add web browser upload route 2017-10-25 22:25:47 +02:00
c29fa441bc
Merge branch 'develop' 2017-10-23 21:07:11 +02:00
de5ff64981
Update dependancies 2017-10-23 21:06:21 +02:00
00e8d2cb4c
Add 'txt' 'patch' and 'md' to the text mime 2017-08-26 11:35:56 +02:00
061c6783d5
Merge branch 'develop' 2017-06-11 15:55:25 +01:00
84bc88c168
Improve configuration
- add storage duration

- add secure size

- add time format
2017-06-11 15:54:41 +01:00
03733610e6
Change LICENSE to GPL-3.0 2017-04-13 13:51:27 +01:00
809d5b5045
Merge branch 'develop' 2017-04-13 00:25:14 +01:00
0afe9fe4e4
Update to v0.2.1 2017-04-13 00:24:56 +01:00
77dafb9fbc
Merge branch 'develop' 2017-04-13 00:19:23 +01:00
bca8c49cd1
Merge branch 'feature/better_big_files' into develop 2017-04-13 00:18:54 +01:00
8db0bb0d8a
Update kemal version 2017-04-13 00:10:18 +01:00
46f10442f9
Reduce the url size 2017-04-12 23:21:00 +01:00
171f6dcdc7
Update deps + upload with post & put 2017-02-13 23:09:39 +00:00
ff3598971c
Update to crystal v0.20, big file work
It is possible to upload very big files as files are not converted to string
automatically. They are written by 2^16 bytes at a time.
2016-11-29 12:30:02 +00:00
a9e72c11a3
Update Makefile (change deps install rule) 2016-10-17 12:43:45 +01:00
e5833c7872
Update specs (kemal) 2016-10-13 00:09:37 +01:00
19b590362e
Udate Dockerfile and relative readme
- add docker entry in the README file
- fix `compile` with `build` in Dockerfile
2016-10-11 17:25:05 +01:00
fb53fc7cd3
Clean index.ecr 2016-10-11 11:43:13 +01:00
8304c1f83c
Improve global architecture
- Update README
- Add `make run`
- move web actions on web/
- move lib classes and constants on lib/
2016-10-11 11:01:18 +01:00
cd4604582d
Fix docker file deps installation 2016-10-10 22:02:24 +01:00
48dc88f60b
Update crystal and use multipart 2016-10-10 11:16:08 +01:00
a0270760e3
Improve EXT_TRANSFORM 2016-08-25 00:18:49 +02:00
8233e5e5eb
update to v0.1.1 2016-07-06 20:41:37 +02:00
55aa216759
better directory init 2016-07-06 20:40:42 +02:00
4c7ec1e41d
fix specs (no specs) and add travis build image 2016-07-06 20:34:55 +02:00
178b6c9a41
add Dockerfile and docker-compose config 2016-07-03 14:35:05 +02:00
a2ba2da073
fix purge delay 2016-07-03 14:12:56 +02:00
64801c97e7
Some error improvements and configuration
- 404 error instead of 500 when file not found
- add TRANSFER_BASE_STORAGE env var
- improve env var handlement
- more robust purge
2016-07-03 14:05:48 +02:00
28dbd93975
fix format (crystal tool format) 2016-07-03 01:30:32 +02:00
e6ee45582e
update email 2016-06-29 21:54:27 +02:00
Arthur Poulet
64a9e6ab90
update makefile to crystal 0.18 2016-06-17 15:44:34 +02:00
Arthur Poulet
d20ef28621
fix plain text
- add transformation txt -> plain
- add charset utf-8 by default for plain text
- fix mime render via extnam
2016-05-23 21:53:15 +02:00
Arthur Poulet
f76c1745d3
update readme 2016-05-23 14:04:27 +02:00
Arthur Poulet
250c2ba736
fix mime search for unix shebang 2016-05-21 14:18:20 +02:00
Arthur Poulet
858d182169
improve index.ecr 2016-05-20 20:11:18 +02:00
Arthur Poulet
b469b3279d
move mime search to mime_search.cr
- create a class MimeSearch
- add new magic numbers
2016-05-20 19:19:29 +02:00
Arthur Poulet
1c92ecbdcb
fix mime search 2016-05-20 18:48:30 +02:00
Arthur Poulet
5f1c408374
Improve mime search
- add magic number search
- improve lisibility
2016-05-20 18:38:19 +02:00
Arthur Poulet
b0ba37da3b
All filenames are downcased before save or send 2016-05-20 17:48:53 +02:00
Arthur Poulet
507d4f870f
add jpe 2016-05-20 17:46:58 +02:00
Arthur Poulet
5d4c759907
update README 2016-05-20 17:39:44 +02:00
Arthur Poulet
2bcbc3277c
update README 2016-05-20 17:21:01 +02:00
Arthur Poulet
25b5de72cc
Add purge system
- a Fiber check every minutes if the files must be removed
- purge every files older than 7 days (1 minutes more or less)
- each files is in a dir based on the upload time (1 minutes more or
  less) and a dedied spawn destroy it
2016-05-20 17:18:04 +02:00
Arthur Poulet
079d753a40
Improve mkdir 2016-05-20 17:17:11 +02:00
Arthur Poulet
59a71a84b9
Use ECR instead of HTML to serve the index 2016-05-20 15:10:29 +02:00
Arthur Poulet
9ef266fb3e
update README 2016-05-20 14:56:12 +02:00
Arthur Poulet
e0638f2830
add Makefile (build, doc, test, release, deps)
close #1
2016-05-20 14:35:41 +02:00
Arthur Poulet
e8da944333
use SecureRandom.hex instead of base64 2016-05-20 14:24:50 +02:00
Arthur Poulet
bfc63d82ae
add index.html, improve readme and fix some stuff 2016-05-20 00:33:23 +02:00
Arthur Poulet
e216dd4507
update readme 2016-05-19 23:20:36 +02:00
19 changed files with 100 additions and 324 deletions

View File

@ -1,12 +0,0 @@
kind: pipeline
name: default
steps:
- name: test
image: crystallang/crystal:latest-alpine
environment:
commands:
- apk --no-cache add curl
- mkdir -p /tmp/files
- make deps
- make test
- make build

1
.travis.yml Normal file
View File

@ -0,0 +1 @@
language: crystal

View File

@ -1,29 +1,30 @@
FROM alpine:edge AS builder
#FROM manastech/crystal
FROM greyltc/archlinux
MAINTAINER Arthur Poulet <arthur.poulet@mailoo.org>
# Add this directory to container as /app
ADD . /build
WORKDIR /build
# Install dependencies
RUN apk add --no-cache \
crystal shards libc-dev yaml-dev libxml2-dev zlib-dev openssl-dev curl
# Install crystal
RUN pacman -Syu --noprogressbar --noconfirm crystal shards llvm35 llvm35-libs clang35 base-devel libxml2
# Install shards
WORKDIR /usr/local
#RUN apt-get update
#RUN DEBIAN_FRONTEND=noninteractive apt-get install -y curl git libssl-dev
#RUN curl -Lo bin/shards.gz https://github.com/crystal-lang/shards/releases/download/v0.6.3/shards-0.6.3_linux_x86_64.gz; gunzip bin/shards.gz; chmod 755 bin/shards
# Add this directory to container as /app
ADD . /transfer_more
WORKDIR /transfer_more
# Install dependencies
RUN shards install
# Build our app
RUN crystal build --release --warnings all src/transfer_more.cr
RUN crystal build --release src/transfer_more.cr
# Run the tests
RUN mkdir /tmp/files && crystal spec
RUN mkdir /tmp/files
#RUN crystal spec
FROM alpine:edge
MAINTAINER Arthur Poulet <arthur.poulet@sceptique.eu>
EXPOSE 3000
RUN apk add --no-cache libgcc libevent libgc++ pcre2
WORKDIR /app
ADD ./public /app/public
COPY --from=builder /build/transfer_more ./transfer_more
ENTRYPOINT ["./transfer_more"]
ENTRYPOINT ./transfer_more --port 3000

View File

@ -6,9 +6,9 @@ all: deps_opt build
run:
crystal run src/transfer_more.cr
build:
crystal build src/transfer_more.cr --stats --warnings all -o $(NAME)
crystal build src/transfer_more.cr --stats -o $(NAME)
release:
crystal build src/transfer_more.cr --stats --release --warnings all -o $(NAME)
crystal build src/transfer_more.cr --stats --release -o $(NAME)
test:
crystal spec
deps:
@ -20,8 +20,9 @@ deps_opt:
doc:
crystal docs
install:
mkdir -p $(PREFIX)/transfer-more
cp $(NAME) $(PREFIX)/transfer-more/
cp -r public $(PREFIX)/transfer-more/
mkdir -p $(PREFIX)/bin
cp $(NAME) $(PREFIX)/bin/$(NAME)
uninstall:
rm $(PREFIX)/bin/$(NAME)
.PHONY: all run build release test deps deps_update doc install uninstall

117
README.md
View File

@ -1,18 +1,16 @@
**Upstream on <https://git.sceptique.eu/Sceptique/transfer_more>**
# transfer_more
Fast and lite file upload server ([transfer.sh](https://transfer.sh/) clone).
![screenshot](https://raw.githubusercontent.com/Nephos/transfer_more/master/sample.png)
![screenshot](https://screenshots.firefoxusercontent.com/images/191ebbd9-a5ea-4fe9-ab8c-d896f59ea08c.png)
- It's a simple online file sharing.
- Files older than 7 days are destroyed (configurable).
- Recognize shebangs, magic numbers, ...
## Installation [![Build Status](https://drone.sceptique.eu/api/badges/Sceptique/transfer_more/status.svg)](https://drone.sceptique.eu/Sceptique/transfer_more)
## Installation [![travis](https://travis-ci.org/Nephos/transfer_more.svg)](https://travis-ci.org/Nephos/transfer_more)
Compatible crystal v1.9.2
Compatible crystal v0.27.0
### From source
@ -22,70 +20,12 @@ make test # run unit test
make doc # build the documentation
```
### From AUR with yay (or yaourt etc.)
### From AUR with yaourt
```sh
yay -S transfer-more
yaourt -S transfer-more
```
### As a systemd service
[Unit]
Description=Tranfer more file sharing
Documentation=https://wiki.archlinux.org/index.php/Transfer-more
[Service]
ExecStart=/usr/share/transfer-more/transfer-more --port 10003 --bind 127.0.0.1
Restart=on-failure
RestartSec=5
Environment="TRANSFER_SSL_ENABLED=true"
WorkingDirectory=/usr/share/transfer-more/
# Hardening
MemoryDenyWriteExecute=true
SystemCallArchitectures=native
CapabilityBoundingSet=
NoNewPrivileges=true
RemoveIPC=true
LockPersonality=true
ProtectControlGroups=true
ProtectKernelTunables=true
ProtectKernelModules=true
ProtectKernelLogs=true
ProtectClock=true
ProtectHostname=true
ProtectProc=noaccess
RestrictRealtime=true
RestrictSUIDSGID=true
RestrictNamespaces=true
RestrictAddressFamilies=AF_UNIX AF_INET AF_INET6
ProtectSystem=full
ProtectHome=true
PrivateDevices=true
PrivateTmp=true
[Install]
WantedBy=default.target
### Behind a nginx proxy
You should configure your nginx with `/etc/nginx/servers-enabled/transfer-more.conf`:
server {
listen 443 ssl;
server_name your.sub.domain;
client_max_body_size 1G;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
location / {
proxy_pass http://localhost:3000;
}
}
## Usage
### Run the Server
@ -94,11 +34,8 @@ You should configure your nginx with `/etc/nginx/servers-enabled/transfer-more.c
export TRANSFER_SSL_ENABLED=true # true if the ssl is enabled, any other string is false
export TRANSFER_BASE_STORAGE="/tmp" # where the files will be kept
export TRANSFER_SECURE_SIZE=4 # how much characters to identify a file
export TRANSFER_STORAGE_DAYS=7 # how much time the files are kept
export TRANSFER_STORRAGE_DAYS=7 # how much time the files are kept
export TRANSFER_TIME_FORMAT="%y%m%d%H"
export TRANSFER_HOST_PORT="localhost:3000" # in pinciple it is auto solved using the http headers, optional
export TRANSFER_MORE_FOOTER="Something <strong>important</strong> on the bottom" # replace the default footer
export TRANSFER_MORE_TITLE="MyName upload" # replace the default title
./transfer_more
```
@ -114,50 +51,32 @@ export TRANSFER_MORE_TITLE="MyName upload"
curl --progress-bar --upload-file file.mp4 http://domain/name.mp4
```
### Inside a Docker container
### Inside a docker
```sh
docker build -t transfer_more . && docker run -p 3000:3000 transfer_more
```
Or with docker-compose:
If you are using docker-compose:
```sh
docker-compose build && docker-compose up
```
### [ShareX](https://github.com/ShareX) template
Else, you can do:
```json
{
"Name": "Sceptique",
"DestinationType": "ImageUploader, TextUploader, FileUploader, URLShortener",
"RequestURL": "https://up.sceptique.eu/",
"FileFormName": "file",
"Headers": {
"User-Agent": "curl"
}
}
```sh
docker build -t transfer_more . && docker run transfer_more
```
## Development
For now I don't have much plan expanding the feature of it, as it fulfills all my needs.
I will keep updating with each crystal new release.
TODO: Write development instructions here
## Contributing
Feel free to propose new feature anyway, we can just put them behind feature flag if it's overkill.
Review your own coding style as possible.
Do not try to include external CI in the upstream, I don't want big centralized service of the GAFAM as possible.
You can either propose a patch in an issue or open a merge request on <https://git.sceptique.eu/Sceptique/transfer_more/fork>.
You can propose it on github if you want, but git.sceptique.eu accept github OAuth so it's very quick to setup and it's my prefered way.
1. Fork it ( <https://github.com/Nephos/transfer_more/fork> )
2. Create your feature branch (git checkout -b my-new-feature)
3. Commit your changes (git commit -am 'Add some feature')
4. Push to the branch (git push origin my-new-feature)
5. Create a new Pull Request
## Contributors
- [Sceptique](https://git.sceptique.eu/Sceptique) Arthur Poulet - creator, maintainer
- [Nephos](https://github.com/Nephos) Arthur Poulet - creator, maintainer

View File

@ -1,102 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="210mm"
height="297mm"
viewBox="0 0 210 297"
version="1.1"
id="svg5"
inkscape:version="1.2 (dc2aedaf03, 2022-05-15)"
sodipodi:docname="carré.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview7"
pagecolor="#505050"
bordercolor="#eeeeee"
borderopacity="1"
inkscape:showpageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#505050"
inkscape:document-units="mm"
showgrid="false"
inkscape:zoom="1.4142136"
inkscape:cx="210.71782"
inkscape:cy="277.18586"
inkscape:window-width="1920"
inkscape:window-height="1003"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="layer1">
<inkscape:grid
type="xygrid"
id="grid2791" />
</sodipodi:namedview>
<defs
id="defs2" />
<g
inkscape:label="Calque 1"
inkscape:groupmode="layer"
id="layer1">
<rect
style="fill:#85b5bb;fill-opacity:1;stroke-width:2.86198"
id="rect165"
width="100"
height="100"
x="51.59375"
y="34.395832"
ry="0" />
<rect
style="fill:#e3d7f4;fill-opacity:1;stroke-width:0.198284"
id="rect2559-2-2"
width="25"
height="25"
x="89.09375"
y="96.895828" />
<g
id="g3324"
transform="translate(0.07217726,-2.5000051)">
<path
sodipodi:type="star"
style="fill:#e3d7f4;fill-opacity:1;stroke-width:0.264583"
id="path2665-6"
inkscape:flatsided="true"
sodipodi:sides="3"
sodipodi:cx="79.323067"
sodipodi:cy="58.415363"
sodipodi:r1="33.237694"
sodipodi:r2="16.618849"
sodipodi:arg1="0.5281275"
sodipodi:arg2="1.5753251"
inkscape:rounded="0"
inkscape:randomized="0"
d="M 108.0322,75.164397 50.463413,74.903682 79.473591,25.17801 Z"
inkscape:transform-center-x="0.024065192"
inkscape:transform-center-y="-5.8292997"
transform="matrix(0.86851499,-0.00296818,0.00248553,0.70188644,32.507167,46.96568)" />
<path
sodipodi:type="star"
style="fill:#e3d7f4;fill-opacity:1;stroke-width:0.264583"
id="path2665-6-9"
inkscape:flatsided="true"
sodipodi:sides="3"
sodipodi:cx="79.323067"
sodipodi:cy="58.415363"
sodipodi:r1="33.237694"
sodipodi:r2="16.618849"
sodipodi:arg1="0.5281275"
sodipodi:arg2="1.5753251"
inkscape:rounded="0"
inkscape:randomized="0"
d="M 108.0322,75.164397 50.463413,74.903682 79.473591,25.17801 Z"
inkscape:transform-center-x="0.024065192"
inkscape:transform-center-y="-5.8292997"
transform="matrix(0.86851499,-0.00296818,0.00248553,0.70188644,32.507165,29.45962)" />
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

BIN
public/images/kemal.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 99 KiB

View File

@ -1,18 +1,18 @@
version: 2.0
version: 1.0
shards:
backtracer:
git: https://github.com/sija/backtracer.cr.git
version: 1.2.2
exception_page:
git: https://github.com/crystal-loot/exception_page.git
version: 0.3.0
github: crystal-loot/exception_page
version: 0.1.1
kemal:
git: https://github.com/sdogruyol/kemal.git
version: 1.3.0
github: sdogruyol/kemal
commit: 482b4a6e7dc3be7a0352fc6b8ee8108fe4cb1105
kilt:
github: jeromegn/kilt
version: 0.4.0
radix:
git: https://github.com/luislavena/radix.git
version: 0.4.1
github: luislavena/radix
version: 0.3.8

View File

@ -1,12 +1,12 @@
name: transfer_more
version: 0.5.9
version: 0.5.0
authors:
- Arthur Poulet <arthur.poulet@sceptique.eu>
- Arthur Poulet <arthur.poulet@mailoo.org>
license: GPL-3.0
dependencies:
kemal:
github: sdogruyol/kemal
version: ~> 1.3
branch: master

7
src/public/css/bootstrap.min.css vendored Normal file

File diff suppressed because one or more lines are too long

BIN
src/public/images/kemal.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 KiB

View File

@ -1,11 +1,13 @@
require "kemal"
require "./transfer_more/*"
# static_headers do |response, filepath, filestat|
# response.headers.add("Access-Control-Allow-Origin", "*")
# response.headers.add("Content-Size", filestat.size.to_s)
# end
# serve_static true
static_headers do |response, filepath, filestat|
if filepath =~ /\.html$/
response.headers.add("Access-Control-Allow-Origin", "*")
end
response.headers.add("Content-Size", filestat.size.to_s)
end
serve_static true
# TODO: proper directory check
Dir.mkdir(TransferMore.storage("files")) rescue nil

View File

@ -1,7 +1,6 @@
module TransferMore
SSL_ENABLED = ENV["TRANSFER_SSL_ENABLED"]?.to_s.downcase == "true"
BASE_STORAGE = ENV["TRANSFER_BASE_STORAGE"]? || "/tmp"
HOST_PORT = ENV["TRANSFER_HOST_PORT"]? || "localhost:3000"
SECURE_SIZE = Int32.new(ENV["TRANSFER_SECURE_SIZE"]? || 4)
STORAGE_DAYS = Int32.new(ENV["TRANSFER_STORAGE_DAYS"]? || 7)
end

View File

@ -2,10 +2,10 @@
module TransferMore
def self.purge(duration, verbose = true)
t_from = Time.local - duration
t_from = Time.now - duration
puts "[PURGE] Start (#{t_from})" if verbose
Dir.entries(storage "files").select do |dir|
t_current = Time.parse(dir, TransferMore::TIME_FORMAT, location: Time::Location.load_local) rescue next
t_current = Time.parse!("#{dir}00", TransferMore::TIME_FORMAT) rescue next
r = t_current < t_from
end.each do |dir|
spawn do
@ -23,9 +23,9 @@ module TransferMore
puts "[REMOVE] #{subdir}/#{file}" if verbose
File.delete("#{subdir}/#{file}")
end
Dir.delete(subdir)
Dir.rmdir(subdir)
end
Dir.delete(storage "files/#{dir}")
Dir.rmdir(storage "files/#{dir}")
end
end

View File

@ -4,8 +4,7 @@ module TransferMore
end
def self.base_url(env)
scheme = Kemal.config.ssl || SSL_ENABLED ? "https://" : "http://"
host_port = env.request.headers["Host"]? || HOST_PORT
"#{scheme}#{host_port}"
scheme =
"http#{Kemal.config.ssl || SSL_ENABLED ? 's' : nil}://#{(env.request.host_with_port || "localhost:3000")}"
end
end

View File

@ -2,7 +2,7 @@ require "random/secure"
private def get_upload_infos(filename : String)
file_name = filename.downcase
dir = Time.local.to_s(TransferMore::TIME_FORMAT) + "/" + Random::Secure.hex(TransferMore::SECURE_SIZE) + (ENV["TRANSFER_MORE_CHRISTMAS"]? == "true" ? "/\u{1F384}" : "")
dir = Time.now.to_s(TransferMore::TIME_FORMAT) + "/" + Random::Secure.hex(TransferMore::SECURE_SIZE) + (ENV["TRANSFER_MORE_CHRISTMAS"]? == "true" ? "/\u{1F384}" : "")
Dir.mkdir_p TransferMore.storage("files/#{dir}")
visible_path = "#{dir}/#{file_name}"
file_path = TransferMore.storage("files/#{visible_path}")
@ -13,7 +13,7 @@ private def upload(env, name_of_upload, io_to_copy)
begin
file_name, dir, visible_path, file_path = get_upload_infos name_of_upload
File.open(file_path, "w") { |f| IO.copy(io_to_copy, f) }
TransferMore.base_url(env) + "/f/" + visible_path
TransferMore.base_url(env) + "/" + visible_path
rescue err
env.response.status_code = 500
"Error 500: #{err}"
@ -73,7 +73,7 @@ post "/" do |env|
parseAndUpload(env)
end
get "/f/:part1/:part2/:file_name" do |env|
get "/:part1/:part2/:file_name" do |env|
file_name = env.params.url["file_name"].to_s.downcase
path = TransferMore.storage("files") + "/" + env.params.url["part1"] + "/" + env.params.url["part2"] + "/" + file_name
begin

View File

@ -1,64 +1,22 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title><%= ENV.fetch("TRANSFER_MORE_TITLE", "File upload") %></title>
<link rel="stylesheet" href="/css/bootstrap.min.css" />
<!-- <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css" integrity="sha384-MCw98/SFnGE8fJT3GXwEOngsV7Zt27NXFoaoApmYm81iuXoPkFOJwJ8ERdknLPMO" crossorigin="anonymous" /> -->
<title>upload with kemal</title>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<!-- <link rel="stylesheet" href="/css/bootstrap.min.css" /> -->
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css" integrity="sha384-MCw98/SFnGE8fJT3GXwEOngsV7Zt27NXFoaoApmYm81iuXoPkFOJwJ8ERdknLPMO" crossorigin="anonymous" />
<!-- <link rel="stylesheet" href="//octicons.github.com/components/octicons/octicons/octicons.css"> -->
<!-- <script src="/js/main.js"></script> -->
<!-- <script src="/js/dropzone.js"></script> -->
<link rel="shortcut icon" href="/images/favicon.ico" type="image/x-icon">
<style type="text/css">
body {
text-align: center;
font-family: Helvetica, Arial;
font-size: 22px;
color: #888;
margin-top: 20px;
}
a {
color: #66b;
text-decoration: none;
}
#c {
margin: 0 auto;
width: 500px;
text-align: left;
}
.dropzone {
font-weight: bold;
text-align: center;
padding: 1em 0;
margin: 1em auto;
color: #555;
border: 2px dashed #555;
border-radius: 6px;
cursor: default;
height: 400px;
max-width: 400px;
background-color: rgba(250, 166, 180, 0.5);
background-repeat: no-repeat;
background-position: bottom;
}
#dropzone.hover {
color: #eaa
border-color: #eaa;
border-style: solid;
box-shadow: inset 0 4px 4px #888;
}
footer {
width: 100%;
display: flex;
justify-content: space-between;
padding: 1em;
}
body { text-align:center;font-family:helvetica,arial;font-size:22px;color:#888;margin:20px;}
a { color:#66b;text-decoration:none; }
#c {margin:0 auto;width:500px;text-align:left}
</style>
</head>
<body>
<h2><%= ENV.fetch("TRANSFER_MORE_TITLE", "File upload") %></h2>
<h2>transfer.sh with kemal</h2>
<% if !file_url.empty? %>
<div class="alert alert-success">
<p>Upload url: <a href="<%= file_url %>"><%= file_url %></a></p>
@ -74,19 +32,22 @@
<form method="POST" action="/" enctype="multipart/form-data">
<div class="form-group">
<div class="dropzone-bg">
<div class="col-lg-10">
<input name="commit" value="Upload" class="btn btn-primary" type="submit">
<input class="form-control dropzone" name="file" id="file" type="file" required>Drop files</input>
<input class="btn btn-default" name="file" id="file" type="file">
</div>
</div>
</form>
<footer>
<span>
<%= ENV.fetch("TRANSFER_MORE_FOOTER", "built by <a href=\"https://git.sceptique.eu/Sceptique\">Sceptique</a>, powered with <a href=\"http://kemalcr.com/\">kemal</a>") %>
<!-- <img src="/images/kemal.png"> -->
<img src="https://kemalcr.com/img/kemal.png">
<footer style="position:fixed;bottom:0px;padding:60px;">
<span style="position:fixed;left:10%">
built by <a href="https://github.com/Nephos/">Nephos</a> with <a href="http://kemalcr.com/">kemal</a>
</span>
<span>
<a href="https://git.sceptique.eu/Sceptique/transfer_more">Fork or patch me</a>
<span style="position:fixed;right:10%">
<a href="https://github.com/Nephos/transfer_more">Fork me</a>
</span>
</footer>
</body>