mirror of
https://github.com/nxshock/simplefileshare.git
synced 2024-11-27 03:11:01 +05:00
Compare commits
8 Commits
49b95701fc
...
c41ff56ffa
Author | SHA1 | Date | |
---|---|---|---|
c41ff56ffa | |||
09463c3b24 | |||
c2cbf59793 | |||
456880bbe7 | |||
14c1e89025 | |||
a2a16af605 | |||
e7a7baa0a0 | |||
48e439da10 |
2
PKGBUILD
2
PKGBUILD
@ -1,5 +1,5 @@
|
|||||||
pkgname=simplefileshare
|
pkgname=simplefileshare
|
||||||
pkgver=0.1.3
|
pkgver=0.1.4
|
||||||
pkgrel=0
|
pkgrel=0
|
||||||
pkgdesc="Simple file share"
|
pkgdesc="Simple file share"
|
||||||
arch=('x86_64' 'aarch64')
|
arch=('x86_64' 'aarch64')
|
||||||
|
53
handlers.go
53
handlers.go
@ -74,30 +74,37 @@ func HandleUpload(w http.ResponseWriter, r *http.Request) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
file, header, err := r.FormFile("file")
|
var errors []string
|
||||||
if err != nil {
|
for _, header := range r.MultipartForm.File["file"] {
|
||||||
http.Error(w, err.Error(), http.StatusBadRequest)
|
file, err := header.Open()
|
||||||
return
|
if err != nil {
|
||||||
}
|
errors = append(errors, err.Error())
|
||||||
defer file.Close()
|
continue
|
||||||
|
}
|
||||||
|
defer file.Close()
|
||||||
|
|
||||||
filePath := filepath.Join(config.StoragePath, header.Filename)
|
filePath := filepath.Join(config.StoragePath, header.Filename)
|
||||||
if _, err := os.Stat(filePath); !os.IsNotExist(err) {
|
if _, err := os.Stat(filePath); !os.IsNotExist(err) {
|
||||||
http.Error(w, "файл с таким именем уже существует", http.StatusBadRequest)
|
errors = append(errors, fmt.Sprintf("файл с именем %s уже существует", header.Filename))
|
||||||
return
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
f, err := os.Create(filePath)
|
||||||
|
if err != nil {
|
||||||
|
errors = append(errors, err.Error())
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
defer f.Close()
|
||||||
|
|
||||||
|
_, err = io.Copy(f, file)
|
||||||
|
if err != nil {
|
||||||
|
errors = append(errors, err.Error())
|
||||||
|
continue
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
f, err := os.Create(filePath)
|
if len(errors) > 0 {
|
||||||
if err != nil {
|
http.Error(w, strings.Join(errors, "\n"), http.StatusBadRequest)
|
||||||
http.Error(w, err.Error(), http.StatusInternalServerError)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
defer f.Close()
|
|
||||||
|
|
||||||
_, err = io.Copy(f, file)
|
|
||||||
if err != nil {
|
|
||||||
http.Error(w, err.Error(), http.StatusInternalServerError)
|
|
||||||
return
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -127,7 +134,7 @@ func HandleDownload(w http.ResponseWriter, r *http.Request) {
|
|||||||
w.Header().Set("Accept-Ranges", "none")
|
w.Header().Set("Accept-Ranges", "none")
|
||||||
w.Header().Set("Content-Length", strconv.Itoa(int(fileStat.Size())))
|
w.Header().Set("Content-Length", strconv.Itoa(int(fileStat.Size())))
|
||||||
|
|
||||||
io.CopyBuffer(w, f, make([]byte, 4096))
|
_, _ = io.CopyBuffer(w, f, make([]byte, 4096))
|
||||||
}
|
}
|
||||||
|
|
||||||
func HandleStream(w http.ResponseWriter, r *http.Request) {
|
func HandleStream(w http.ResponseWriter, r *http.Request) {
|
||||||
@ -157,5 +164,5 @@ func HandleIcon(w http.ResponseWriter, r *http.Request) {
|
|||||||
w.Header().Set("Content-Type", "image/svg+xml")
|
w.Header().Set("Content-Type", "image/svg+xml")
|
||||||
w.Header().Set("Cache-Control", "public, max-age=31557600")
|
w.Header().Set("Cache-Control", "public, max-age=31557600")
|
||||||
|
|
||||||
io.Copy(w, f)
|
_, _ = io.Copy(w, f)
|
||||||
}
|
}
|
||||||
|
2
main.go
2
main.go
@ -28,7 +28,7 @@ func init() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if config.RemoveFilePeriod > 0 {
|
if config.RemoveFilePeriod > 0 {
|
||||||
go removeOldFilesThread(config.StoragePath, time.Duration(config.RemoveFilePeriod)*time.Hour)
|
go removeOldFilesThread(time.Duration(config.RemoveFilePeriod) * time.Hour)
|
||||||
}
|
}
|
||||||
|
|
||||||
http.HandleFunc("/", HandleRoot)
|
http.HandleFunc("/", HandleRoot)
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html>
|
<html lang="ru">
|
||||||
|
|
||||||
<head>
|
<head>
|
||||||
<meta charset="utf-8">
|
<meta charset="utf-8">
|
||||||
@ -12,12 +12,12 @@
|
|||||||
<body>
|
<body>
|
||||||
<header>
|
<header>
|
||||||
<span>
|
<span>
|
||||||
<img src="/favicon.svg">
|
<img src="/favicon.svg" alt="icon">
|
||||||
File Storage
|
File Storage
|
||||||
</span>
|
</span>
|
||||||
<label>
|
<label>
|
||||||
<input id="file-uploader" type="file" id="upload-button">
|
<input id="file-uploader" type="file" multiple>
|
||||||
Загрузить файл
|
Загрузить файл(ы)
|
||||||
</label>
|
</label>
|
||||||
</header>
|
</header>
|
||||||
<main>
|
<main>
|
||||||
@ -30,42 +30,47 @@
|
|||||||
<th>Размер</th>
|
<th>Размер</th>
|
||||||
<th>Дата</th>
|
<th>Дата</th>
|
||||||
</tr>
|
</tr>
|
||||||
{{range .Files}} <tr>
|
{{range .Files}} <tr>
|
||||||
<td><img src="/icon?ext={{.Ext}}"> <a href="/download?filename={{.Name}}">{{.Name}}</a> <a class="right" href="/stream?filename={{.Name}}">просмотр</a></td>
|
<td><img src="/icon?ext={{.Ext}}"> <a href="/download?filename={{.Name}}">{{.Name}}</a> <a class="right" href="/stream?filename={{.Name}}">просмотр</a></td>
|
||||||
<td><pre>{{.Size}}</pre></td>
|
<td>
|
||||||
|
<pre>{{.Size}}</pre>
|
||||||
|
</td>
|
||||||
<td>{{.Date}}</td>
|
<td>{{.Date}}</td>
|
||||||
</tr>
|
</tr>
|
||||||
{{end}} </table>
|
{{end}}
|
||||||
|
</table>
|
||||||
</main>
|
</main>
|
||||||
<footer>
|
<footer>
|
||||||
Файлы хранятся как минимум {{.StorageDuration}} ч.
|
Файлы хранятся как минимум {{.StorageDuration}} ч.
|
||||||
</footer>
|
</footer>
|
||||||
|
<script>
|
||||||
|
function myProgressHandler(event) {
|
||||||
|
var p = Math.floor(event.loaded / event.total * 100);
|
||||||
|
document.querySelector("label").innerHTML = 'Загрузка: ' + p + '%...';
|
||||||
|
}
|
||||||
|
|
||||||
|
function myOnLoadHandler(event) {
|
||||||
|
const response = event.currentTarget;
|
||||||
|
if (response.status != 200) {
|
||||||
|
alert('Ошибка при загрузке:\n' + response.responseText);
|
||||||
|
}
|
||||||
|
document.querySelector("label").innerHTML = 'Загрузка завершена.';
|
||||||
|
window.location.reload();
|
||||||
|
}
|
||||||
|
|
||||||
|
document.getElementById("file-uploader").addEventListener('change', (e) => {
|
||||||
|
var formData = new FormData;
|
||||||
|
var ajax = new XMLHttpRequest;
|
||||||
|
for (var i = 0; i < document.getElementById("file-uploader").files.length; i++) {
|
||||||
|
file = document.getElementById("file-uploader").files[i];
|
||||||
|
formData.append('file', file);
|
||||||
|
}
|
||||||
|
ajax.upload.addEventListener("progress", myProgressHandler, false);
|
||||||
|
ajax.addEventListener('load', myOnLoadHandler, false);
|
||||||
|
ajax.open('POST', '/upload', true);
|
||||||
|
ajax.send(formData);
|
||||||
|
});
|
||||||
|
</script>
|
||||||
</body>
|
</body>
|
||||||
|
|
||||||
</html>
|
</html>
|
||||||
<script type="text/javascript">
|
|
||||||
function myProgressHandler(event) {
|
|
||||||
var p = Math.floor(event.loaded/event.total*100);
|
|
||||||
document.querySelector("label").innerHTML = 'Загрузка: ' + p + '%...';
|
|
||||||
}
|
|
||||||
|
|
||||||
function myOnLoadHandler(event) {
|
|
||||||
const response = event.currentTarget;
|
|
||||||
if (response.status != 200) {
|
|
||||||
alert('Ошибка при загрузке файла:\n' + response.responseText);
|
|
||||||
}
|
|
||||||
document.querySelector("label").innerHTML = 'Загрузка завершена.';
|
|
||||||
location.reload();
|
|
||||||
}
|
|
||||||
|
|
||||||
document.getElementById("file-uploader").addEventListener('change', (e) => {
|
|
||||||
var file = document.getElementById("file-uploader").files[0];
|
|
||||||
var formData = new FormData;
|
|
||||||
formData.append('file', file);
|
|
||||||
var ajax = new XMLHttpRequest;
|
|
||||||
ajax.upload.addEventListener("progress", myProgressHandler, false);
|
|
||||||
ajax.addEventListener('load', myOnLoadHandler, false);
|
|
||||||
ajax.open('POST', '/upload', true);
|
|
||||||
ajax.send(formData);
|
|
||||||
});
|
|
||||||
</script>
|
|
@ -8,12 +8,12 @@ import (
|
|||||||
log "github.com/sirupsen/logrus"
|
log "github.com/sirupsen/logrus"
|
||||||
)
|
)
|
||||||
|
|
||||||
func removeOldFilesThread(path string, olderThan time.Duration) {
|
func removeOldFilesThread(olderThan time.Duration) {
|
||||||
ticker := time.NewTicker(time.Hour)
|
ticker := time.NewTicker(time.Hour)
|
||||||
|
|
||||||
for _ = range ticker.C {
|
for range ticker.C {
|
||||||
log.Debugln("Removing old files...")
|
log.Debugln("Removing old files...")
|
||||||
err := removeOldFiles(path, olderThan)
|
err := removeOldFiles(olderThan)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Println(err)
|
log.Println(err)
|
||||||
}
|
}
|
||||||
@ -21,7 +21,7 @@ func removeOldFilesThread(path string, olderThan time.Duration) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func removeOldFiles(path string, olderThan time.Duration) error {
|
func removeOldFiles(olderThan time.Duration) error {
|
||||||
return filepath.Walk(config.StoragePath, func(path string, info os.FileInfo, err error) error {
|
return filepath.Walk(config.StoragePath, func(path string, info os.FileInfo, err error) error {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
Loading…
Reference in New Issue
Block a user