This project is a simple file server implemented in Go that allows users to upload, download, list, and delete files. The server saves uploaded files in an uploads
directory and provides endpoints to manage the files.
- Go (1.16 or higher)
- PowerShell (for testing and interacting with the server)
-
Create a New Go Module
If you're starting a new project, you'll want to initialize it as a Go module. Navigate to your project directory and run:
go mod init github.com/yourusername/your-repository-name
Replace
github.com/yourusername/your-repository-name
with the desired module path. -
Create the Project Structure
Inside your project directory, create the necessary directories and files:
mkdir uploads
This will create the
uploads
directory where uploaded files will be stored. -
Create the
main.go
FileCreate a
main.go
file in your project directory and import theFileServerGolang
package to use it. Here's an examplemain.go
file:package main import ( "github.com/Niall1985/FileServerGolang" ) func main() { fileserver.StartServer(":8080") }
-
Install the
FileServerGolang
PackageInstall the
FileServerGolang
package using thego get
command:go get -u github.com/Niall1985/FileServerGolang
You can run the server directly with go run
. First, create a new main.go
file in your project directory and import the fileserver
package:
- Run the server using:
go run main.go
Alternatively, you can build and run the server executable:
-
Build the Project
go build -o file-server
-
Run the Executable
./file-server
The server will start listening on port 8080.
To upload a file from your local system to the server, use the following PowerShell script:
$FilePath = "C:\Path\To\Your\File.ext"
$Uri = "http://localhost:8080/upload"
$fileName = [System.IO.Path]::GetFileName($FilePath)
$fileContent = [System.IO.File]::ReadAllBytes($FilePath)
$boundary = [System.Guid]::NewGuid().ToString()
$bodyLines = @(
"--$boundary",
"Content-Disposition: form-data; name=`"file`"; filename=`"$fileName`"",
"Content-Type: application/octet-stream",
"",
[System.Text.Encoding]::Default.GetString($fileContent),
"--$boundary--"
)
$body = $bodyLines -join "`r`n"
$bytes = [System.Text.Encoding]::Default.GetBytes($body)
$webRequest = [System.Net.HttpWebRequest]::Create($Uri)
$webRequest.Method = "POST"
$webRequest.ContentType = "multipart/form-data; boundary=$boundary"
$webRequest.ContentLength = $bytes.Length
$stream = $webRequest.GetRequestStream()
$stream.Write($bytes, 0, $bytes.Length)
$stream.Close()
$response = $webRequest.GetResponse()
$reader = New-Object System.IO.StreamReader($response.GetResponseStream())
$result = $reader.ReadToEnd()
Write-Host $result
To view the list of files in the uploads
directory:
$Uri = "http://localhost:8080/list"
Invoke-RestMethod -Uri $Uri -Method Get
To download a specific file from the server:
$FileName = "example.pdf" # Replace with the actual filename
$Uri = "http://localhost:8080/download/$FileName"
$OutputPath = "C:\path\to\save\downloaded_example.pdf" # Replace with the desired output path
Invoke-WebRequest -Uri $Uri -OutFile $OutputPath
To delete a specific file from the server:
$FileName = "example.pdf" # Replace with the actual filename
$Uri = "http://localhost:8080/delete/$FileName"
Invoke-RestMethod -Uri $Uri -Method Delete
- Upload a File:
POST /upload
- Download a File:
GET /download/{filename}
- List Files:
GET /list
- Delete a File:
DELETE /delete/{filename}
Contributions are welcome! Please submit a pull request or open an issue for any changes or suggestions.
This project is licensed under the MIT License - see the LICENSE file for details.