30
main.go
30
main.go
@@ -12,6 +12,7 @@ import (
|
||||
"net/http"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strconv"
|
||||
"strings"
|
||||
"sync"
|
||||
"time"
|
||||
@@ -34,6 +35,7 @@ var assetsFS embed.FS
|
||||
type meta struct {
|
||||
Expiry time.Time `json:"expiry"`
|
||||
ExpireOnView bool `json:"expire_on_view"`
|
||||
FileName string `json:"file_name,omitempty"`
|
||||
}
|
||||
|
||||
func init() {
|
||||
@@ -144,8 +146,8 @@ Upload from stdin and expire on first view:
|
||||
<input type="submit" value="Upload file">
|
||||
</div>
|
||||
</form>
|
||||
<h2 style="margin-top:1.5rem">Quick text</h2>
|
||||
<p class="small">Type or paste text and upload as a .txt (no file chooser needed).</p>
|
||||
<h2 style="margin-top:1.5rem">No file? Type your text in here!</h2>
|
||||
<p class="small">Type or paste text and upload as a .txt.</p>
|
||||
<textarea id="textArea" placeholder="Type or paste here..."></textarea>
|
||||
<div class="controls" style="margin-top:.5rem">
|
||||
<button id="uploadTextBtn" type="button">Upload text</button>
|
||||
@@ -285,6 +287,7 @@ func uploadHandler(w http.ResponseWriter, r *http.Request) {
|
||||
|
||||
var reader io.Reader
|
||||
var ext string
|
||||
var fileName string
|
||||
|
||||
contentType := r.Header.Get("Content-Type")
|
||||
if strings.HasPrefix(contentType, "multipart/form-data") {
|
||||
@@ -293,6 +296,7 @@ func uploadHandler(w http.ResponseWriter, r *http.Request) {
|
||||
defer file.Close()
|
||||
reader = file
|
||||
ext = filepath.Ext(header.Filename)
|
||||
fileName = filepath.Base(header.Filename)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -345,7 +349,10 @@ func uploadHandler(w http.ResponseWriter, r *http.Request) {
|
||||
m.Expiry = time.Now().Add(d)
|
||||
}
|
||||
}
|
||||
if !m.Expiry.IsZero() || m.ExpireOnView {
|
||||
if fileName != "" {
|
||||
m.FileName = fileName
|
||||
}
|
||||
if !m.Expiry.IsZero() || m.ExpireOnView || m.FileName != "" {
|
||||
metaBytes, _ := json.Marshal(m)
|
||||
_ = os.WriteFile(path+".json", metaBytes, 0644)
|
||||
}
|
||||
@@ -357,6 +364,20 @@ func uploadHandler(w http.ResponseWriter, r *http.Request) {
|
||||
fmt.Fprintf(w, "%s://%s/%s\n", scheme, domain, filename)
|
||||
}
|
||||
|
||||
func contentDispositionInlineFilename(name string) string {
|
||||
q := strconv.QuoteToASCII(name)
|
||||
var b strings.Builder
|
||||
for i := 0; i < len(name); i++ {
|
||||
c := name[i]
|
||||
if (c >= '0' && c <= '9') || (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') || c == '.' || c == '-' || c == '_' {
|
||||
b.WriteByte(c)
|
||||
} else {
|
||||
fmt.Fprintf(&b, "%%%02X", c)
|
||||
}
|
||||
}
|
||||
return fmt.Sprintf(`inline; filename=%s; filename*=UTF-8''%s`, q, b.String())
|
||||
}
|
||||
|
||||
func viewHandler(w http.ResponseWriter, r *http.Request) {
|
||||
id := strings.TrimPrefix(r.URL.Path, "/")
|
||||
if id == "" {
|
||||
@@ -379,6 +400,9 @@ func viewHandler(w http.ResponseWriter, r *http.Request) {
|
||||
defer os.Remove(path)
|
||||
defer os.Remove(metaPath)
|
||||
}
|
||||
if m.FileName != "" {
|
||||
w.Header().Set("Content-Disposition", contentDispositionInlineFilename(m.FileName))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user