Upload files to "/"
This commit is contained in:
363
server.go
Normal file
363
server.go
Normal file
@@ -0,0 +1,363 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
|
||||
"bufio"
|
||||
"errors"
|
||||
"fmt"
|
||||
"io"
|
||||
"net/http"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"io/ioutil"
|
||||
"strings"
|
||||
)
|
||||
|
||||
const mediaDir = "media/"
|
||||
|
||||
func LoadServersFromFile(filename string) ([]string, error) {
|
||||
// Open the text file for reading
|
||||
file, err := os.Open(filename)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
defer file.Close()
|
||||
|
||||
// Create a slice to store IP addresses
|
||||
var ips []string
|
||||
|
||||
// Create a scanner to read the file line by line
|
||||
scanner := bufio.NewScanner(file)
|
||||
for scanner.Scan() {
|
||||
// Extract the IP from the line
|
||||
ip := scanner.Text()
|
||||
|
||||
// Append the IP address to the slice
|
||||
ips = append(ips, ip)
|
||||
}
|
||||
|
||||
// Check for any errors during scanning
|
||||
if err := scanner.Err(); err != nil {
|
||||
return nil, fmt.Errorf("error reading file: %w", err)
|
||||
}
|
||||
|
||||
return ips, nil
|
||||
}
|
||||
|
||||
func AddServerToFile(filename, ip string) error {
|
||||
// Open the text file for appending
|
||||
file, err := os.OpenFile(filename, os.O_APPEND|os.O_WRONLY, 0644)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer file.Close()
|
||||
|
||||
// Write the new IP to the file
|
||||
_, err = fmt.Fprintln(file, ip)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func getRoot(w http.ResponseWriter, r *http.Request) {
|
||||
fmt.Printf("got / request\n")
|
||||
io.WriteString(w, "This is my website!\n")
|
||||
}
|
||||
func getHello(w http.ResponseWriter, r *http.Request) {
|
||||
fmt.Printf("got /hello request\n")
|
||||
io.WriteString(w, "Hello, HTTP!\n")
|
||||
}
|
||||
func getData(w http.ResponseWriter, r *http.Request) {
|
||||
fmt.Printf("got /data request\n")
|
||||
// Set the content type header
|
||||
w.Header().Set("Content-Type", "application/json")
|
||||
|
||||
// Write your data to the response writer
|
||||
// Here we're just returning a simple JSON response
|
||||
io.WriteString(w, `{"message": "Hello, this is your data!"}`)
|
||||
}
|
||||
func getIPs(w http.ResponseWriter, r *http.Request) {
|
||||
fmt.Printf("got /ips request\n")
|
||||
// Set the content type header
|
||||
w.Header().Set("Content-Type", "text/plain")
|
||||
|
||||
// Load IPs from file
|
||||
ips, err := LoadServersFromFile("servers.txt")
|
||||
if err != nil {
|
||||
http.Error(w, fmt.Sprintf("Error loading IPs: %s", err), http.StatusInternalServerError)
|
||||
return
|
||||
}
|
||||
|
||||
// Write IPs to the response writer separated by newline
|
||||
for _, ip := range ips {
|
||||
io.WriteString(w, ip+"\n")
|
||||
}
|
||||
}
|
||||
func addIP(w http.ResponseWriter, r *http.Request) {
|
||||
fmt.Printf("got /addip request\n")
|
||||
// Check if the request method is POST
|
||||
if r.Method != http.MethodPost {
|
||||
http.Error(w, "Only POST requests are allowed", http.StatusMethodNotAllowed)
|
||||
return
|
||||
}
|
||||
|
||||
// Parse the IP address from the request body
|
||||
ip := r.FormValue("ip")
|
||||
if ip == "" {
|
||||
http.Error(w, "IP address is required", http.StatusBadRequest)
|
||||
return
|
||||
}
|
||||
|
||||
// Add the IP address to the file
|
||||
err := AddServerToFile("servers.txt", ip)
|
||||
if err != nil {
|
||||
http.Error(w, fmt.Sprintf("Error adding IP: %s", err), http.StatusInternalServerError)
|
||||
return
|
||||
}
|
||||
|
||||
// Respond with a success message
|
||||
io.WriteString(w, "IP address added successfully\n")
|
||||
}
|
||||
func RemoveIPFromFile(filename, ipToRemove string) error {
|
||||
// Open the original file for reading
|
||||
file, err := os.Open(filename)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer file.Close()
|
||||
|
||||
// Create a new file to store the updated IP addresses
|
||||
newFilename := filename + ".tmp"
|
||||
newFile, err := os.Create(newFilename)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer newFile.Close()
|
||||
|
||||
// Create a scanner to read the file line by line
|
||||
scanner := bufio.NewScanner(file)
|
||||
for scanner.Scan() {
|
||||
// Extract the IP from the line
|
||||
ip := scanner.Text()
|
||||
|
||||
// Check if the IP matches the one to remove
|
||||
if ip != ipToRemove {
|
||||
// Write the IP to the new file
|
||||
_, err := fmt.Fprintln(newFile, ip)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Check for any errors during scanning
|
||||
if err := scanner.Err(); err != nil {
|
||||
return fmt.Errorf("error reading file: %w", err)
|
||||
}
|
||||
|
||||
// Close the new file
|
||||
if err := newFile.Close(); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// Replace the original file with the new file
|
||||
if err := os.Rename(newFilename, filename); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func removeIP(w http.ResponseWriter, r *http.Request) {
|
||||
fmt.Printf("got /removeip request\n")
|
||||
// Check if the request method is POST
|
||||
if r.Method != http.MethodPost {
|
||||
http.Error(w, "Only POST requests are allowed", http.StatusMethodNotAllowed)
|
||||
return
|
||||
}
|
||||
|
||||
// Parse the IP address from the request body
|
||||
ip := r.FormValue("ip")
|
||||
if ip == "" {
|
||||
http.Error(w, "IP address is required", http.StatusBadRequest)
|
||||
return
|
||||
}
|
||||
|
||||
// Remove the IP address from the file
|
||||
err := RemoveIPFromFile("servers.txt", ip)
|
||||
if err != nil {
|
||||
http.Error(w, fmt.Sprintf("Error removing IP: %s", err), http.StatusInternalServerError)
|
||||
return
|
||||
}
|
||||
|
||||
// Respond with a success message
|
||||
io.WriteString(w, "IP address removed successfully\n")
|
||||
}
|
||||
|
||||
func uploadFileHandler(w http.ResponseWriter, r *http.Request) {
|
||||
// Parse the multipart form
|
||||
err := r.ParseMultipartForm(10 << 20) // 10 MB limit
|
||||
if err != nil {
|
||||
http.Error(w, err.Error(), http.StatusBadRequest)
|
||||
return
|
||||
}
|
||||
|
||||
// Get the file from the form
|
||||
file, handler, err := r.FormFile("file")
|
||||
if err != nil {
|
||||
http.Error(w, err.Error(), http.StatusBadRequest)
|
||||
return
|
||||
}
|
||||
defer file.Close()
|
||||
|
||||
// Get the path from the form or set a default path
|
||||
path := r.FormValue("path")
|
||||
if path == "" {
|
||||
path = mediaDir + handler.Filename // Default path
|
||||
} else {
|
||||
path = mediaDir + path
|
||||
}
|
||||
|
||||
// Create the directory if it doesn't exist
|
||||
err = os.MkdirAll(filepath.Dir(path), 0755)
|
||||
if err != nil {
|
||||
http.Error(w, err.Error(), http.StatusInternalServerError)
|
||||
return
|
||||
}
|
||||
|
||||
// Save the file to the specified path
|
||||
outFile, err := os.Create(path)
|
||||
if err != nil {
|
||||
http.Error(w, err.Error(), http.StatusInternalServerError)
|
||||
return
|
||||
}
|
||||
defer outFile.Close()
|
||||
|
||||
// Copy the file content
|
||||
_, err = io.Copy(outFile, file)
|
||||
if err != nil {
|
||||
http.Error(w, err.Error(), http.StatusInternalServerError)
|
||||
return
|
||||
}
|
||||
|
||||
// Return success response
|
||||
fmt.Fprintf(w, "File uploaded successfully\n")
|
||||
}
|
||||
|
||||
func downloadFileHandler(w http.ResponseWriter, r *http.Request) {
|
||||
// Get the file path from the URL parameter
|
||||
filePath := strings.TrimPrefix(r.URL.Path, "/download/")
|
||||
if filePath == "" {
|
||||
http.Error(w, "File path is required", http.StatusBadRequest)
|
||||
return
|
||||
}
|
||||
filePath = mediaDir + filePath // prepend media directory
|
||||
|
||||
// Read the file content
|
||||
fileBytes, err := ioutil.ReadFile(filePath)
|
||||
if err != nil {
|
||||
http.Error(w, err.Error(), http.StatusInternalServerError)
|
||||
return
|
||||
}
|
||||
|
||||
// Set the appropriate headers
|
||||
w.Header().Set("Content-Disposition", "attachment; filename="+filepath.Base(filePath))
|
||||
w.Header().Set("Content-Type", "application/octet-stream")
|
||||
w.Header().Set("Content-Length", fmt.Sprintf("%d", len(fileBytes)))
|
||||
|
||||
// Write the file content to the response body
|
||||
_, err = w.Write(fileBytes)
|
||||
if err != nil {
|
||||
http.Error(w, err.Error(), http.StatusInternalServerError)
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
func listFilesHandler(w http.ResponseWriter, r *http.Request) {
|
||||
// Get the path from the query parameter or set the default path
|
||||
path := r.URL.Query().Get("path")
|
||||
if path == "" {
|
||||
path = mediaDir
|
||||
} else {
|
||||
path = mediaDir + path
|
||||
}
|
||||
|
||||
// List files in the specified directory
|
||||
files, err := ioutil.ReadDir(path)
|
||||
if err != nil {
|
||||
http.Error(w, err.Error(), http.StatusInternalServerError)
|
||||
return
|
||||
}
|
||||
|
||||
// Build the response
|
||||
var fileNames []string
|
||||
for _, file := range files {
|
||||
fileNames = append(fileNames, file.Name())
|
||||
}
|
||||
|
||||
// Write the file list as a response
|
||||
fmt.Fprintf(w, "Files in directory %s:\n", path)
|
||||
for _, name := range fileNames {
|
||||
fmt.Fprintf(w, "%s\n", name)
|
||||
}
|
||||
}
|
||||
|
||||
func deleteFileHandler(w http.ResponseWriter, r *http.Request) {
|
||||
// Get the file path from the URL parameter
|
||||
filePath := strings.TrimPrefix(r.URL.Path, "/delete/")
|
||||
if filePath == "" {
|
||||
http.Error(w, "File path is required", http.StatusBadRequest)
|
||||
return
|
||||
}
|
||||
filePath = mediaDir + filePath // prepend media directory
|
||||
|
||||
// Delete the file
|
||||
err := os.Remove(filePath)
|
||||
if err != nil {
|
||||
http.Error(w, err.Error(), http.StatusInternalServerError)
|
||||
return
|
||||
}
|
||||
|
||||
// Return success response
|
||||
fmt.Fprintf(w, "File deleted successfully\n")
|
||||
}
|
||||
|
||||
|
||||
func main() {
|
||||
ips, err := LoadServersFromFile("servers.txt")
|
||||
if err != nil {
|
||||
fmt.Println("Error:", err)
|
||||
return
|
||||
}
|
||||
|
||||
// Print the loaded IP addresses
|
||||
fmt.Println("Loaded servers:")
|
||||
for _, ip := range ips {
|
||||
fmt.Println(ip)
|
||||
}
|
||||
|
||||
http.HandleFunc("/", getRoot)
|
||||
http.HandleFunc("/hello", getHello)
|
||||
http.HandleFunc("/data", getData)
|
||||
http.HandleFunc("/ips", getIPs)
|
||||
http.HandleFunc("/addip", addIP)
|
||||
http.HandleFunc("/removeip", removeIP)
|
||||
http.HandleFunc("/upload", uploadFileHandler)
|
||||
http.HandleFunc("/download/", downloadFileHandler)
|
||||
http.HandleFunc("/list", listFilesHandler)
|
||||
http.HandleFunc("/delete/", deleteFileHandler)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
err = http.ListenAndServe(":3333", nil)
|
||||
if errors.Is(err, http.ErrServerClosed) {
|
||||
fmt.Printf("server closed\n")
|
||||
} else if err != nil {
|
||||
fmt.Printf("error starting server: %s\n", err)
|
||||
os.Exit(1)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user