0.0.0
This commit is contained in:
parent
9f08672b0c
commit
724fb45516
4 changed files with 88 additions and 31 deletions
15
src/config.cr
Normal file
15
src/config.cr
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
require "yaml"
|
||||||
|
|
||||||
|
class Config
|
||||||
|
include YAML::Serializable
|
||||||
|
|
||||||
|
property files : String = "./files"
|
||||||
|
property filename_lenght : Int8 = 3
|
||||||
|
|
||||||
|
def self.load
|
||||||
|
config_file = "config/config.yml"
|
||||||
|
config_yaml = File.read(config_file)
|
||||||
|
config = Config.from_yaml(config_yaml)
|
||||||
|
config
|
||||||
|
end
|
||||||
|
end
|
|
@ -1,7 +1,10 @@
|
||||||
require "http"
|
require "http"
|
||||||
require "kemal"
|
require "kemal"
|
||||||
require "yaml"
|
require "yaml"
|
||||||
require "mime"
|
# require "mime"
|
||||||
|
|
||||||
|
require "./utils"
|
||||||
|
require "./config"
|
||||||
|
|
||||||
# macro error(message)
|
# macro error(message)
|
||||||
# env.response.content_type = "application/json"
|
# env.response.content_type = "application/json"
|
||||||
|
@ -10,20 +13,6 @@ require "mime"
|
||||||
# error_message
|
# error_message
|
||||||
# end
|
# end
|
||||||
|
|
||||||
class Config
|
|
||||||
include YAML::Serializable
|
|
||||||
|
|
||||||
property files : String = "./files"
|
|
||||||
property filename_lenght : Int8 = 3
|
|
||||||
|
|
||||||
def self.load
|
|
||||||
config_file = "config/config.yml"
|
|
||||||
config_yaml = File.read(config_file)
|
|
||||||
config = Config.from_yaml(config_yaml)
|
|
||||||
config
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
CONFIG = Config.load
|
CONFIG = Config.load
|
||||||
|
|
||||||
if !Dir.exists?("#{CONFIG.files}")
|
if !Dir.exists?("#{CONFIG.files}")
|
||||||
|
@ -35,13 +24,8 @@ if !Dir.exists?("#{CONFIG.files}")
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def random_string : String
|
get "/" do |env|
|
||||||
retardation = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
|
render "src/views/index.ecr"
|
||||||
res = IO::Memory.new
|
|
||||||
CONFIG.filename_lenght.times do
|
|
||||||
"".rjust(res, 1, retardation[Random.rand(62)])
|
|
||||||
end
|
|
||||||
res.to_s
|
|
||||||
end
|
end
|
||||||
|
|
||||||
# TODO: Error checking later
|
# TODO: Error checking later
|
||||||
|
@ -49,11 +33,10 @@ post "/upload" do |env|
|
||||||
filename = ""
|
filename = ""
|
||||||
extension = ""
|
extension = ""
|
||||||
HTTP::FormData.parse(env.request) do |upload|
|
HTTP::FormData.parse(env.request) do |upload|
|
||||||
# if upload.filename.nil?
|
next if upload.filename.nil? || upload.filename.to_s.empty?
|
||||||
# error("No file provided")
|
pp upload
|
||||||
# end
|
|
||||||
extension = File.extname("#{upload.filename}")
|
extension = File.extname("#{upload.filename}")
|
||||||
filename = random_string()
|
filename = Utils.random_string(CONFIG.filename_lenght)
|
||||||
# filename = "#{Base64.urlsafe_encode("#{Random.rand(9999 % 1000)}", padding = false)}.#{upload.filename.to_s[extension + 1..]}"
|
# filename = "#{Base64.urlsafe_encode("#{Random.rand(9999 % 1000)}", padding = false)}.#{upload.filename.to_s[extension + 1..]}"
|
||||||
# Be sure to check if file.filename is not empty otherwise it'll raise a compile time error
|
# Be sure to check if file.filename is not empty otherwise it'll raise a compile time error
|
||||||
if !filename.is_a?(String)
|
if !filename.is_a?(String)
|
||||||
|
@ -66,10 +49,17 @@ post "/upload" do |env|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
env.response.content_type = "application/json"
|
env.response.content_type = "application/json"
|
||||||
JSON.build do |j|
|
if !filename.empty?
|
||||||
j.object do
|
JSON.build do |j|
|
||||||
j.field "link", "#{env.request.headers["Host"]}/#{filename + extension}"
|
j.object do
|
||||||
|
j.field "link", "#{env.request.headers["Host"]}/#{filename + extension}"
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
else
|
||||||
|
env.response.content_type = "application/json"
|
||||||
|
env.response.status_code = 403
|
||||||
|
error_message = {"error" => "No file"}.to_json
|
||||||
|
error_message
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -77,7 +67,7 @@ get "/:filename" do |env|
|
||||||
begin
|
begin
|
||||||
if !File.extname(env.params.url["filename"]).empty?
|
if !File.extname(env.params.url["filename"]).empty?
|
||||||
send_file env, "#{CONFIG.files}/#{env.params.url["filename"]}"
|
send_file env, "#{CONFIG.files}/#{env.params.url["filename"]}"
|
||||||
next
|
next
|
||||||
end
|
end
|
||||||
dir = Dir.new("#{CONFIG.files}")
|
dir = Dir.new("#{CONFIG.files}")
|
||||||
dir.each do |filename|
|
dir.each do |filename|
|
||||||
|
@ -85,7 +75,7 @@ get "/:filename" do |env|
|
||||||
send_file env, "#{CONFIG.files}/#{env.params.url["filename"]}" + File.extname(filename)
|
send_file env, "#{CONFIG.files}/#{env.params.url["filename"]}" + File.extname(filename)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
raise "Fuck"
|
raise ""
|
||||||
rescue
|
rescue
|
||||||
env.response.content_type = "text/plain"
|
env.response.content_type = "text/plain"
|
||||||
env.response.status_code = 403
|
env.response.status_code = 403
|
||||||
|
@ -93,4 +83,26 @@ get "/:filename" do |env|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# delete "/:filename" do |env|
|
||||||
|
# begin
|
||||||
|
# if !File.extname(env.params.url["filename"]).empty?
|
||||||
|
# File.delete?("#{CONFIG.files}/#{env.params.url["filename"]}")
|
||||||
|
# "File deleted successfully"
|
||||||
|
# next
|
||||||
|
# end
|
||||||
|
# dir = Dir.new("#{CONFIG.files}")
|
||||||
|
# dir.each do |filename|
|
||||||
|
# if filename.starts_with?("#{env.params.url["filename"]}")
|
||||||
|
# File.delete?("#{CONFIG.files}/#{env.params.url["filename"]}" + File.extname(filename))
|
||||||
|
# "File deleted successfully"
|
||||||
|
# end
|
||||||
|
# end
|
||||||
|
# raise ""
|
||||||
|
# rescue
|
||||||
|
# env.response.content_type = "text/plain"
|
||||||
|
# env.response.status_code = 403
|
||||||
|
# "File does not exist"
|
||||||
|
# end
|
||||||
|
# end
|
||||||
|
|
||||||
Kemal.run
|
Kemal.run
|
||||||
|
|
13
src/utils.cr
Normal file
13
src/utils.cr
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
module Utils
|
||||||
|
extend self
|
||||||
|
|
||||||
|
# Thanks crystal community
|
||||||
|
# https://forum.crystal-lang.org/t/is-this-a-good-way-to-generate-a-random-string/6986/6
|
||||||
|
def random_string(len) : String
|
||||||
|
chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
|
||||||
|
String.new(len) do |bytes|
|
||||||
|
bytes.to_slice(len).fill { chars.to_slice.sample }
|
||||||
|
{len, len}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
17
src/views/index.ecr
Normal file
17
src/views/index.ecr
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>File Upload Example</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<form action="/upload" method="post" enctype="multipart/form-data">
|
||||||
|
<label for="file">Choose file:</label>
|
||||||
|
<input type="file" id="file" name="filename" accept=".jpg,.jpeg,.png">
|
||||||
|
<br><br>
|
||||||
|
<input type="submit" value="Upload File" name="submit">
|
||||||
|
</form>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
Loading…
Reference in a new issue