Uploadr - Rust Edition.
Uploadr is a simple tool to upload files to a host of your choice, and then copy the URL to your clipboard for easy sharing. Written in Rust, it's fast, lightweight, and NOT cross-platform (Windows already has an all-in-one tool for this, and macOS is lame).
Previously written in C++, this is a rewrite in Rust. It's not as feature-complete as the C++ version, but it should be more stable and easier to maintain. It's also a lot faster probably.
- Upload stuff to things
- Configurable HTTP request method
- Configurable HTTP request headers
- Configurable HTTP request body
- multipart/form-data
- application/octet-stream
- Response Parsing
- JSON
- XML
- URL-encoded
- Reg-exp matching
- Clipboard stuff and things
- Copy to clipboard
- Upload from clipboard
- Binary data (images, etc.)
- Text data
- File paths (file://, absolute paths) (arboard is currently very restrictive about the types of data it supports, and on some DEs, copying a file does not copy a file:// URL in text/plain format, so this is not currently possible)
- Configuration stuff and things
- Default target
- Generate default config file
- Multiple upload targets
- Templating for upload target configurations.
- File related templates
- File name
- File extension
- File size
- File MIME type
- Environment variable templates
- Response related templates
- Response body
- Response headers
- Response status code
- Response URL
- Randomness related templates
- Random string
- Random number
- Integer
- Float
- Random UUID
- Random choice
- Config related templates
- Uploader config related templates
- File related templates
- Notifications stuff and things
- Upload progress
- Upload complete
- Open URL in browser
- Open management page
- Display upload preview (if applicable)
- Upload failed
- Upload history stuff and things
- GUI stuff and things?!?!?!?!?!? (probably not)
The configuration file format has changed slightly from the C++ version. Removing some unnecessary complexity, and adding some new features. The new format is as follows:
Old:
{
"defaultUploader": "string",
"archive": {
"enabled": true,
"path": "/dev/null",
"maxCount": 1000,
"histFile": "string"
},
"clipboard": {
"enabled": true
},
"notification": {
"enabled": "bool",
"sound": "string",
"timeout": 5
}
}
New:
{
"default_uploader": "uploader", // Now snake_case
"archive": {
"enabled": true,
"path": "/dev/null", // Must be an absolute path
"max": 1000 // Renamed to max
// Hist file is in the same directory as the config file, so it's not necessary to specify it.
},
"clipboard": {
"enabled": true,
"read_only": false // New option to disable setting the clipboard
},
"notification": {
"enabled": true,
"timeout": 5 // Timeout in seconds
// Sound is not used in the Rust version.
}
}
Individual uploaders are configured in their own files, and are named "{Uploader name}.uploader", this has not changed.
Old:
{
"request": {
// MultipartFormData body
"body": {
"fields": {
"field_name": "stuff",
"other_field_name": "{content}" // The content that should be uploaded
},
"type": "MultipartFormData"
},
// Other body types are omitted for brevity
"headers": {
"Header": "Value"
},
"method": "POST",
"url": "http://example.com"
},
"response": {
"url": "stuff",
"manageUrl": "more_stuff",
"thumbnailUrl": "the_most_stuff"
}
}
New:
{
"request": {
"body": {
"field": "file",
"type": "MultipartFormData" // Can be MultipartFormData or Raw, Raw has no configurable fields.
},
"headers": {
"Header": "Value"
},
"method": "POST",
"url": "https://example.com"
},
"response": {
"url": "stuff",
"manage_url": "more_stuff",
"thumbnail_url": "the_most_stuff"
}
}
Uploadr supports templating in the uploader configuration files. This allows you to use variables in your configuration that will be replaced the appropriate values at runtime. Formatted as { directive:parameter;...parameters }
, templates can also be nested inside each other, allowing for complex configurations.
Unclosed templates and invalid directives will cause uploadr to panic with an error message.
-
Configuration related directives
config:path
- Get a value from the primary configuration file. It takes a JSON path and returns the value at that path. It must refer to only a single value, and cannot be an array or object.uploader:path
- Get a value from the uploader configuration file. It takes a JSON path and returns the value at that path. It must refer to only a single value, and cannot be an array or object.
-
env:parameter
- Get an environment variable. It takes a single parameter, which is the name of the environment variable to get. If the environment variable is not set, uploadr will panic with an error message. -
random:type;...parameters
random:int;min;max
- Get a random integer betweenmin
andmax
(inclusive).min
andmax
must be integers.random:float;min;max
- Get a random float betweenmin
andmax
(inclusive).min
andmax
must be floats.random:choice;...choices
- Get a random choice from the provided choices. Choices must be separated by semicolons.random:uuid
- Get a random v4 UUID.random:string;length;alphabet
- Get a random string of the specified length.length
must be an integer.alphabet
is optional, and if not provided, defaults toabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
. It can be any string of characters, and can be any length.
-
File related directives
file:name
- Get the name of the file being uploaded.file:ext
- Get the extension of the file being uploaded.file:size
- Get the size of the file being uploaded.file:mime
- Get the MIME type of the file being uploaded.
-
Response related directives (these are only available in the
response
section of the uploader config)response:body
response:body;json;path
(A.K.A.json:path
) - Get a value from the response body. It takes a JSON path and returns the value at that path. It must refer to only a single value, and cannot be an array or object.response:body;xml;path
(A.K.A.xml:path
) - Get a value from the response body. It takes an XPath and returns the value at that path. It must refer to only a single value, and cannot be an array or object. (untested but might work)response:body;regexp;pattern
(A.K.A.regexp:pattern
) - Get a value from the response body. It takes a regular expression and returns the first match. It must refer to only a single value, and cannot be an array or object. (untested but might work)
response:headers;header
- Get a value from the response headers. It takes a header name and returns the value of that header. Case-insensitive.response:status_code
- Get the status code of the response.response:url
- Get the final URL of the response. This is useful if the server redirects the request.