├── .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 | FileMap Preview 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 | FileMap 预览 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 | 3 | 矩形备份 19 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/dist/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | FileMap 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | services: 2 | postgres: 3 | image: postgres:17 4 | container_name: pg 5 | restart: always 6 | environment: 7 | POSTGRES_USER: postgres 8 | POSTGRES_PASSWORD: HUP5#ZpW4taj3YdF 9 | POSTGRES_DB: filemap 10 | ports: 11 | - "5432:5432" 12 | volumes: 13 | - ./postgresql/data:/var/lib/postgresql/data 14 | networks: 15 | - net 16 | healthcheck: 17 | test: ["CMD", "pg_isready", "-U", "postgres"] 18 | interval: 3s 19 | timeout: 3s 20 | retries: 3 21 | 22 | filemap: 23 | image: file-map 24 | container_name: filemap 25 | restart: always 26 | environment: 27 | GIN_MODE: release 28 | RESOURCE_DIR: resource 29 | DATABASE_URL: host=pg user=postgres password=HUP5#ZpW4taj3YdF dbname=filemap port=5432 sslmode=disable 30 | SECRET_JWT: 8Sz0nqYNig4t76ZcVEDiVnwhmSm49W6M 31 | PASSWORD: 1234 32 | ports: 33 | - "443:443" 34 | volumes: 35 | - ./resource:/app/resource 36 | - ./app/cert:/app/cert 37 | - ./app/dist:/app/dist 38 | - ./log:/log 39 | depends_on: 40 | postgres: 41 | condition: service_healthy 42 | networks: 43 | - net 44 | 45 | networks: 46 | net: 47 | driver: bridge 48 | -------------------------------------------------------------------------------- /file-map.tar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kuroill/file-map/6ee2356bd02ba1f477f59ed5a6d4614bcb3773be/file-map.tar -------------------------------------------------------------------------------- /img/preview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kuroill/file-map/6ee2356bd02ba1f477f59ed5a6d4614bcb3773be/img/preview.png --------------------------------------------------------------------------------