A simple file transfer app
A simple file transfer web app with support of P2P. Backend is written in Golang, frontend with React.
I have deployed this app on my server, please go to https://worksphere.cn/transfer. You'll be redirected to another page with the URL like this:
https://worksphere.cn/transfer/pdhwhwdwny84x1qvzig3xg0z
On this page, you can upload 4 files at most(each file 5M at most), send the page URL to your friends. You don't need to wait for the upload to finish, then send the URL. Your friends will see the upload progress as you do. Each page will expire after 20 minutes, after that, all files are removed, and the page URL is no longer valid.
This is a personal site with limited network bandwidth and storage, don't expect too much from the server performance. However, if you and your friends are both online at he same time, you can try the P2P transfer(Chrome browser only) which copy the file between your browsers without going through server. The number of files and file size you can transfer in P2P mode is only limited by your computer hard drive. But P2P connection is not guaranteed to work 100%.
Here is a running screenshot:
go get github.com/edwardwohaijun/file-transfer/cmd/filetransferd cd $GOPATH/src/github.com/edwardwohaijun/file-transfer/ go build -o filetransferd cmd/filetransferd/main.gocd web npm install npm run build (for development environment) npm run ship (for production environment)
filetransferdbinary and
web/directory(only
publicsubdirectory is needed) to wherever you seem fit.
The absolute
webdirectory need to be passed as
-webRootargument when run the binary, for example:
bash filetransferd -webRoot /var/www/filetransferd/web
serverPortdefault is
9090.
mgoHostmongoDB host IP and port, default is
127.0.0.1:27017.
mgoUsernamemongoDB username, default is empty.
mgoPasswordmongoDB password, default is empty.
mgoDBNamemongoDB database name, default is
filetransfer.
mgoCollectionNamemongoDB collection name, default is
files.
maxUploadthe maximum allowed number of upload files for one page, default is 5.
maxFileSizethe maximum allowed single filesize, default is 20M, only allowed unit is
megabyte,
10m,
20Mare all valid.
durationhow long uploaded files exist on server, default is 30m, allowed units are: m(minute), h(hour), d(day).
urlRootPaththe path following your domain(or IP), for example:
transferin http://www.example.com/transfer, default is empty.
webRootthe directory to serve web static files, default is
webin current working directory.
uploadDirthe directory to save the uploaded files, default is
upload, relative directory is assumed to be inside current working directory.
webrtcConfigthe iceServer list to help both parties make P2P connection, you need to pass the argument in quoted JSON string, default is empty.
Examples:
bash filetransferd -serverPort 9090 -maxUpload 5 -maxFileSize 20M -duration 30m -urlRootPath abc/xyz/ -webRoot ./web -uploadDir ./upload -webrtcConfig '{"iceServers":[{"urls":"stun:stun.l.google.com:19302"},{"urls":"stun:global.stun.twilio.com:3478?transport=udp"}]}'Go to http://127.0.0.1:9090/abc/xyz/, if you want to experience the P2P file transfer, open 2 tabs. You can run multiple app instances, as long as they have different
serverPort.
If you have Nginx(>= 1.7.11) running in front, let it handle the
webRootdirectory for better performance. Copy the
web/publicfolder to where Nginx can access (like
/var/www/webApp/transfer/), and edit Nginx config file, like the following: ```
location /transfer/public { alias /var/www/webApp/transfer/web/public/; } location /transfer { proxypass http://127.0.0.1:9090; proxyrequestbuffering off; proxyredirect off; proxysetheader Upgrade $httpupgrade; proxysetheader Connection "upgrade"; proxysetheader Host $httphost; proxysetheader X-Real-IP $remoteaddr; proxysetheader X-Forwarded-For $proxyaddxforwardedfor; proxysetheader X-ForwardedProto $scheme; } ```
The P2P feature works pretty well in small office and local network, you can adjust the
maxUpload,
maxFileSizeto meet your needs. It only takes you less than 2 minutes to
go getthe code, build, deploy the web app, :stuckouttonguewinkingeye:.
This project is licensed under the MIT License.