├── .gitignore
├── Makefile
├── README.en.md
├── README.md
├── app
├── cert
│ ├── cert.pem
│ └── key.pem
└── dist
│ ├── assets
│ ├── McLaren-DbDI8PGA.ttf
│ ├── index-9YDB902X.js
│ ├── index-BdwBZO1S.css
│ └── logo-hQ47gUh6.svg
│ └── index.html
├── docker-compose.yml
├── file-map.tar
└── img
└── preview.png
/.gitignore:
--------------------------------------------------------------------------------
1 | .DS_Store
2 | resource
3 | postgresql
--------------------------------------------------------------------------------
/Makefile:
--------------------------------------------------------------------------------
1 | CERT_DIR=./app/cert
2 | CERT_PATH=$(CERT_DIR)/cert.pem
3 | KEY_PATH=$(CERT_DIR)/key.pem
4 |
5 | cert:
6 | @if command -v ipconfig > /dev/null; then \
7 | IP=$$(ipconfig getifaddr en1 2>/dev/null || ipconfig getifaddr en0 2>/dev/null); \
8 | elif command -v hostname > /dev/null; then \
9 | IP=$$(hostname -I | awk '{print $$1}'); \
10 | else \
11 | IP=$$(ifconfig | grep "inet " | grep -v "127.0.0.1" | awk '{print $$2}' | head -n 1); \
12 | fi; \
13 | mkdir -p $(CERT_DIR); \
14 | mkcert -cert-file $(CERT_PATH) -key-file $(KEY_PATH) $$IP localhost 127.0.0.1 ::1;
15 |
16 |
--------------------------------------------------------------------------------
/README.en.md:
--------------------------------------------------------------------------------
1 | [English](README.en.md) | [简体中文](README.md)
2 |
3 | # FileMap
4 |
5 | FileMap is a LAN-based cross-device file sharing and management tool that enables seamless file, text, and image uploads and access across different devices.
6 |
7 | ---
8 |
9 | ## Features
10 |
11 | - **Cross-Device and Cross-Platform Access**
12 | Any device connected to the same LAN can access FileMap via a browser, enabling quick sharing of files, text, and images.
13 |
14 | - **Support for Multiple File Types**
15 | - Desktop: Supports direct pasting of text or files.
16 | - Mobile: Allows quick text pasting in the navigation bar's central area.
17 | - Other file types can be submitted conveniently via an upload form.
18 |
19 | - **Flexible Directory Management**
20 | Supports creating new directories and moving directories, making it easy to organize folder hierarchies and manage categories.
21 |
22 | - **Batch Operations**
23 | Supports batch downloading and batch deletion to improve daily operation efficiency.
24 |
25 | - **Free File and Directory Movement**
26 | Files and folders can be freely moved between directories, allowing flexible storage structure adjustments.
27 |
28 | ---
29 |
30 | ## Preview
31 |
32 |
33 |
34 | ---
35 |
36 | ## Running with Docker
37 |
38 | ```bash
39 | make cert # Generate local certificate (Optional)
40 | cd your_project_dir # Navigate to project directory
41 | docker load -i file-map.tar # Load Docker image
42 | docker compose up -d # Start service in the background
43 | ```
44 |
45 | Other commands:
46 |
47 | ```bash
48 | docker compose restart # Restart service
49 | docker compose down # Stop service
50 | ```
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | [English](README.en.md) | [简体中文](README.md)
2 |
3 | # FileMap
4 |
5 | FileMap 是一款基于局域网的跨设备文件共享与管理工具,实现了不同设备间文件、文本、图片的便捷上传与访问
6 |
7 | ---
8 |
9 | ## 功能
10 |
11 | - **跨设备跨平台访问**
12 | 任何连接同一局域网的设备均可通过浏览器访问 FileMap,实现文件、文本、图片的快速共享
13 |
14 | - **多类型文件上传支持**
15 | - 桌面端支持直接粘贴文本或文件
16 | - 移动端支持导航栏中心区域快速粘贴文本
17 | - 其他文件类型通过上传表单便捷提交
18 |
19 | - **灵活目录管理**
20 | 支持新建目录、目录移动,轻松整理文件夹层级,实现分类管理
21 |
22 | - **批量操作**
23 | 支持批量下载、批量删除,提升日常操作效率
24 |
25 | - **文件与目录自由移动**
26 | 文件和文件夹可在不同目录间自由移动,便于调整存储结构
27 |
28 | ---
29 |
30 | ## 预览
31 |
32 |
33 |
34 | ---
35 |
36 | ## 使用 Docker 运行
37 |
38 | ```bash
39 | make cert # 生成本地证书(可选)
40 | cd your_project_dir # 进入项目目录
41 | docker load -i file-map.tar # 加载 Docker 镜像
42 | docker compose up -d # 后台启动服务
43 | ```
44 |
45 | 其他命令
46 |
47 | ```bash
48 | docker compose restart # 重启服务
49 | docker compose down # 停止服务
50 | ```
--------------------------------------------------------------------------------
/app/cert/cert.pem:
--------------------------------------------------------------------------------
1 | -----BEGIN CERTIFICATE-----
2 | MIIEHDCCAoSgAwIBAgIQYNxb5qFOUQV2G6yl5HLzszANBgkqhkiG9w0BAQsFADBb
3 | MR4wHAYDVQQKExVta2NlcnQgZGV2ZWxvcG1lbnQgQ0ExGDAWBgNVBAsMD2tAMTky
4 | LjE2OC4yLjEwNDEfMB0GA1UEAwwWbWtjZXJ0IGtAMTkyLjE2OC4yLjEwNDAeFw0y
5 | NTA1MjkxNDUxMzJaFw0yNzA4MjkxNDUxMzJaMDsxJzAlBgNVBAoTHm1rY2VydCBk
6 | ZXZlbG9wbWVudCBjZXJ0aWZpY2F0ZTEQMA4GA1UECwwHa0BrdXJvaTCCASIwDQYJ
7 | KoZIhvcNAQEBBQADggEPADCCAQoCggEBAOKadba5GKqdrDIagHiH0h2bEjriTJXn
8 | 4tLwe+FR8Drr662dv3pUpkfyRomkcGCsb47qY+9OsleFFvfBjzFtEi8VKOYrtzOZ
9 | EIdtcGj+pKP6+C1/VZoRutxqvc3nALCihAW/8pMagMd8jfBG30jVaBm8WF51BB5D
10 | AkDML7PYJL94nfp49x/8qpLcuz8BLH93q51K0zyfLWtsp7qOynB/24LSMNUooKks
11 | r0gQOSC2bz7Or1q3PBG6g5La/7IfvAGAbH1snh8KQpjTN44g6YFBF9lcz+QtL2MB
12 | Sit8waExXhRp7jhPjp2otMU4PaXzu77VRJh7bstxZUKasyzzC64cy6ECAwEAAaN8
13 | MHowDgYDVR0PAQH/BAQDAgWgMBMGA1UdJQQMMAoGCCsGAQUFBwMBMB8GA1UdIwQY
14 | MBaAFM+XECzmkFqXAcNBqWBHwtulUEILMDIGA1UdEQQrMCmCCWxvY2FsaG9zdIcE
15 | wKgCE4cEfwAAAYcQAAAAAAAAAAAAAAAAAAAAATANBgkqhkiG9w0BAQsFAAOCAYEA
16 | J49bd3T9n46YwNyFrHLgb40WWZs0WbwBpdvqHE4pW3aeuATwM1BH7UESGlBVqKMp
17 | 7/yG2RJBbK3ELH0ELZWghrm3xeeGTr9eQk2bi+dr3t3v3pxj7YKlBeIOsSUTEw29
18 | ZWv+R1wh7XQy6D97/38U0ob00PDE20VKGKyy5uCNPcTs1Hhj+eCKJ/o0O01EffCE
19 | clJO45w2dXOXosD1eFjTALsz6XGO+6UFonbEuSqwaEpKHlk1cL2MMd3wd1h7Ts0A
20 | Q7CgT3+P2Ysa+5+gPjIhxDEOvg6wqZYRuu4UCS+aCwagElaz3vxdXwZT5uApkIkr
21 | Ky2wGQkLGr+rLKzGXWXiWeM+colRfG0nTJhRsx2WAbY99mq+/q/lz8WPLo3HK7tA
22 | fbs41+B0Q+Bk8iQhF5PFDyKDtWeSr55kyHow9K01Zi1XsQ094BJcr+SvWhxyXXkU
23 | HV1w37HQe7WgC3IfnZZ8y0z27Xm0xaXNeVIfxdzlrpIpfsMhv7nOf8pjS6KM5MA1
24 | -----END CERTIFICATE-----
25 |
--------------------------------------------------------------------------------
/app/cert/key.pem:
--------------------------------------------------------------------------------
1 | -----BEGIN PRIVATE KEY-----
2 | MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDimnW2uRiqnawy
3 | GoB4h9IdmxI64kyV5+LS8HvhUfA66+utnb96VKZH8kaJpHBgrG+O6mPvTrJXhRb3
4 | wY8xbRIvFSjmK7czmRCHbXBo/qSj+vgtf1WaEbrcar3N5wCwooQFv/KTGoDHfI3w
5 | Rt9I1WgZvFhedQQeQwJAzC+z2CS/eJ36ePcf/KqS3Ls/ASx/d6udStM8ny1rbKe6
6 | jspwf9uC0jDVKKCpLK9IEDkgtm8+zq9atzwRuoOS2v+yH7wBgGx9bJ4fCkKY0zeO
7 | IOmBQRfZXM/kLS9jAUorfMGhMV4Uae44T46dqLTFOD2l87u+1USYe27LcWVCmrMs
8 | 8wuuHMuhAgMBAAECggEBAI+RcRctupUOhLTR2aeD1fnv7+Li0ccAPdOLjdE6Cswq
9 | AQ3krhYhX6ChvVMjnheB6MRReLN71r5gkiayubiE9EpkS59Y/x9v0OscyWWcQE+s
10 | iGS7Ek8lAJD6B/tWajd/H8pMzLGqzwCUx5D+NiV9IBF+JTbjSJKrvde0Bl0Zil7M
11 | KYfpjK11ya42s+t21u32ekRez/plmUFKjsvXwA2qCe00UCT7XfbIHE2juCR1TjXQ
12 | nHj2QxiEdYbRBzNThDsMDFAtUEk+PHm+LZuIFWU2EGQ+jgDCDlAjjo1T7az8nJ9R
13 | rJ9Cr3+237y3Z2VpU79LbS5Uvtab/rX8NG9zbR5R42ECgYEA7+NBxStMOUqLwozF
14 | x7Y9PCjGLIhv5Xd/9kPQR08sVGiC3G3HLd5QcvzpE4aKb8SBQLi5rHCfGWSBr+ok
15 | MrtoWLtqzobQACN21u3vGbUb/Q++SynPkOaLWRWqT6jFZmruUUGCwJ08YDkKQk2i
16 | PMhEev4qoa12XzLdWeYL8irOoZ0CgYEA8dLJByyLgTOZIWyCR/bILTibwcmFBPQ7
17 | 5+O7nXjvppNfUH/SxmtIoQaIJHRR1kxaUOsLxzMR1V1sq8EowYxUIdaW6YkFPSTc
18 | fHucZ+cBOXPQyieaoBaFzqbz56NARPoGoY7E663wp9UY1XKHeR1QZ8ixOJJg1+hJ
19 | qJDzOsubZNUCgYEAjtdTooRVrwekkQQiAPmTHO9qkbnsZ0bw+0MGEnAihWB2C6uS
20 | ns1yOgY/A1FpvYPVMyTL6tJk6kner1FMnKjbSXrP7op38J0tdm3Xogcl01o8haUv
21 | 46hj8XflIentIT8rCVdo9Ciset98LF7t7COUI2iVGhCgG6+9/nntQxYaVEECgYBt
22 | qrMCLuBhSp4ie0wmCLPFVkvEuXg6w+w7AJtAEe1U9LagEifrVhIM/KJXLe1DK0M2
23 | OTIRN4bZ5VF4HtQ12kb5RZEQ/dPDY+keBwzqTefPP0ertgQ4n541Fp+8J9vorB6/
24 | u7hwTWS7KDfn7NWlRncFag18411J7Q0ihgHYYyfotQKBgGcht82fZ17YHbyNa2jd
25 | iK7AO8DpYNcMVilcdi97XNgxJOG43F8bOPGRW96ymPSiW1fmKLXeZPrh0HMvZ2Xl
26 | xMCWpFbv2P5AqREd3orl7iq+fKNrJiUxO7cr6vx1P0i9Y9S3cwJxKFKdUGp38Rf3
27 | HoRu8fDT99IJuAdTepKb2p8V
28 | -----END PRIVATE KEY-----
29 |
--------------------------------------------------------------------------------
/app/dist/assets/McLaren-DbDI8PGA.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kuroill/file-map/6ee2356bd02ba1f477f59ed5a6d4614bcb3773be/app/dist/assets/McLaren-DbDI8PGA.ttf
--------------------------------------------------------------------------------
/app/dist/assets/index-BdwBZO1S.css:
--------------------------------------------------------------------------------
1 | html,body{margin:0;width:100%;height:100%;background:#fff;font-family:McLaren}body{display:flex;flex-direction:column;align-items:center}#root{width:100%;height:100%;display:flex;flex-direction:column}div,input,li{box-sizing:border-box}h3{margin:0}ul,li,p{margin:0;padding:0}div::-webkit-scrollbar,ul::-webkit-scrollbar{display:none}li{list-style:none}a{text-decoration:none;color:#111}.model_down{padding:15px;font-size:16px}#_rht_toaster{font-size:16px}.ReactModal__Overlay{background:#00000080!important;outline:none!important}.modal{width:calc(100% - 50px);border:none;top:50%!important;left:50%!important;right:auto!important;bottom:auto!important;margin-right:-50%!important;transform:translate(-50%,-50%)!important;background:#fff;position:absolute!important;border-radius:20px;outline:none!important}::-webkit-scrollbar{display:none}.preview{display:flex;align-items:center;height:100%;background:#000}.preview img{width:100%}.preview .file_viewer{height:100%}.preview_audio{display:flex;align-items:center;justify-content:center}.preview_code{background:#fff}.modal_create{padding:20px 15px}.modal_upload_box{width:100%;display:flex;align-items:center;justify-content:space-between}.modal_upload_box .close{margin-left:15px;width:49px;height:49px;display:flex;align-items:center;justify-content:center;border-radius:15px;border:.5px solid #eeeeee;font-size:14px;color:#111}.modal_upload{flex:1;margin:10px 0;display:flex;align-items:center;justify-content:center;width:100%;height:49px;border-radius:15px;border:.5px solid #eeeeee}.input,.select{margin:10px 0;width:100%;height:49px;background:#fafafa;color:#111;padding:0 15px;outline:none;font-size:14px;box-sizing:border-box;border:none;border-radius:15px;-webkit-appearance:none;-moz-appearance:none;appearance:none}.select_mv_modal{padding:20px}.select_mv_modal .select_mv_title{margin-bottom:15px;font-size:14px}.no_margin{margin:0}.input:focus,.select:focus{outline:none;color:#111;background:#fafafa;border:none}.modal_create_btn{margin:10px 0;width:100%;height:49px;border-radius:15px;background:#7dd6fa;color:#fff;border:none;outline:none}.modal_create_btn:active{background:#72c4e5}.modal_files{text-align:center;color:#111;font-size:12px}.modal_files p{line-height:30px}.modal_links{padding:20px}.modal_links .modal_links_item{display:flex;align-items:center;justify-content:space-between;font-size:14px;height:36px}.modal_links .modal_links_item .modal_link{flex:1;overflow-x:auto}.modal_links .modal_links_item .modal_links_edit{margin-left:15px}.modal_links .modal_links_item .modal_links_edit .modal_links_copy{color:#75ebe8}.modal_links .modal_links_item .modal_links_edit .modal_links_open{margin-left:15px;color:#7dd6fa}*{font-family:MiSans,McLaren;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent}@font-face{font-family:McLaren;src:url(/assets/McLaren-DbDI8PGA.ttf) format("truetype");font-weight:400;font-style:normal}*{scrollbar-width:none!important}*::-webkit-scrollbar{display:none!important}.home{padding:0 25px;width:100%;max-height:100%;overflow-y:auto;transition:all .3s;flex:1;display:flex;flex-direction:column}.home .place{margin-top:114px}.home header{padding:25px 0 15px;position:fixed;top:0;left:50%;transform:translate(-50%);width:100%;background:#fff}.home header .nav{padding:0 25px;font-size:14px;color:#111;display:flex;align-items:center;justify-content:space-between}.home header .nav .search{border-radius:20px;border:.5px solid #eeeeee}.home header .nav .upload{display:flex;align-items:center;justify-content:center;width:54px;height:54px;border-radius:20px;border:.5px solid #eeeeee}.home header .nav .nav_height{position:relative;z-index:-1;height:49px;opacity:0}.home header .nav .nav_title{margin:0;font-size:18px;font-weight:400;text-align:start;max-width:150px;height:54px;line-height:54px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.home header .nav .search_input{width:100%;height:42px;font-size:17px;color:#111;background:transparent;border-radius:10px;outline:none;border:none}.home header .nav .search_input::placeholder{color:#888}.home header .main_header{padding:0 25px;margin-top:15px;display:flex;justify-content:space-between}.home header .main_header .title{font-size:17px;margin:0;color:#111}.home header .main_header .delete{margin-right:20px;color:#ff808b}.home header .main_header .download{margin-right:20px;color:#7dd6fa}.home header .main_header .move{margin-right:20px;color:#f7b87b}.home header .main_header .select{color:#7dd6fa}.home header .main_header .main_header_right{display:flex;align-items:center;justify-content:center;cursor:pointer}.home header .main_header .main_header_right span{font-size:17px}.home main{flex:1;margin:20px 0}.home main .resent li .recent_name{font-size:14px;max-width:56px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.home main .list{padding-bottom:1px}.home main .list .item{display:flex;align-items:center}.home main .list .item .checkbox_group{display:inline-block;height:auto;width:auto;line-height:0;padding:0}.home main .list .item .checkbox_group .checkbox{padding-right:20px}.home main .list .item .cont{padding:18px;width:100%;display:flex;align-items:center;margin:10px 0;background:#fafafa;border-radius:20px;flex:1;min-width:0}.home main .list .item .cont .type_icon{margin-right:13px;border-radius:10px;display:flex;align-items:center}.home main .list .item .cont .list_info{flex:1;min-width:0;max-width:100%;display:flex;flex-direction:column}.home main .list .item .cont .list_info .list_info_name{margin-bottom:6px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:flex;align-items:center;justify-content:space-between}.home main .list .item .cont .list_info .list_info_name .list_info_name_title{font-size:15px;flex:1;overflow-x:auto;min-width:0}.home main .list .item .cont .list_info .list_info_name .menu{margin-left:15px;display:flex;align-items:center;justify-content:center}.home main .list .item .cont .list_info .list_info_name span{font-size:20px;color:#111}.home main .list .item .cont .list_info .list_size{margin-top:2px;font-size:13px;color:#666}.home main .list .item .cont .list_info li{font-size:16px}.home main .list .item .cont .list_info span{font-size:14px;color:#888}.home main .resent{width:100%;display:flex;align-items:center;overflow-x:scroll}.home main .resent li{margin-right:20px;padding:20px;background:#fafafa;border-radius:10px;display:flex;flex-direction:column;align-items:center}.home main .resent li:last-child{margin-right:0}.home main .resent li .type_icon{border-radius:10px;display:flex;align-items:center}.home main .resent li span{margin-top:10px;font-size:14px}.home main .no{margin:20px 0;width:100%;text-align:center;font-size:14px;color:#888}.home .hide{opacity:0}.password{flex:1;padding:25px;display:flex;flex-direction:column;align-items:center}.password .password_input{width:100%;padding:0 15px;height:54px;font-size:14px;color:#111;background:#fafafa;border-radius:10px;outline:none;border:none}.password .password_input::placeholder{color:#888}.password button{margin-top:20px;width:100%;height:49px;border-radius:10px;outline:none;border:none;color:#fff;background:#7dd6fa}.password button:active{background:#72c4e5}
2 |
--------------------------------------------------------------------------------
/app/dist/assets/logo-hQ47gUh6.svg:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/app/dist/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |