求推荐支持加密文件名压缩文件夹的http服务器

查看 27|回复 3
作者:netspirit   
求推荐一个http文件服务器的软件,需要能够通过http的方式下载文件夹并打包成压缩包,而且这个压缩包需要时加密的而且还隐藏文件名
需要不占用内存而且免费的
举个例子,比如我的根目录是/文件夹1
然后文件夹1里面有a,b,c三个文件夹
那我用http请求http://xxx.xxx.xxx.xxx/a.7z或者zip或者rar
我能下载把a文件夹打包成压缩文件并且加密并且能够隐藏文件名的加密的压缩包
尽量不要占用太多的内存 而且要稳定 支持直接连接的方式下载加密压缩并加密文件名的文件夹打包成的压缩文件

文件夹, 文件名

pzx521521   

能够隐藏文件名 不懂什么意思
pzx521521   

要实现你描述的功能,你需要创建一个 HTTP 服务器,接收下载请求,打包指定文件夹为加密的压缩文件,并且隐藏压缩文件的文件名。下面是一个使用 Go 的简单示例,展示如何实现这个功能。
Go 代码示例
package main
import (
    "archive/zip"
    "crypto/aes"
    "crypto/cipher"
    "crypto/rand"
    "io"
    "io/ioutil"
    "log"
    "net/http"
    "os"
    "path/filepath"
)
// 生成 AES 密钥
func generateKey() ([]byte, error) {
    key := make([]byte, 32) // AES-256
    if _, err := rand.Read(key); err != nil {
        return nil, err
    }
    return key, nil
}
// AES 加密
func encrypt(data []byte, key []byte) ([]byte, error) {
    block, err := aes.NewCipher(key)
    if err != nil {
        return nil, err
    }
    ciphertext := make([]byte, aes.BlockSize+len(data))
    iv := ciphertext[:aes.BlockSize]
    if _, err := rand.Read(iv); err != nil {
        return nil, err
    }
    stream := cipher.NewCFBEncrypter(block, iv)
    stream.XORKeyStream(ciphertext[aes.BlockSize:], data)
    return ciphertext, nil
}
// 将文件夹压缩为加密的 zip 文件
func zipFolder(folderPath string, zipFilePath string, key []byte) error {
    zipFile, err := os.Create(zipFilePath)
    if err != nil {
        return err
    }
    defer zipFile.Close()
    zipWriter := zip.NewWriter(zipFile)
    defer zipWriter.Close()
    err = filepath.Walk(folderPath, func(file string, info os.FileInfo, err error) error {
        if err != nil {
            return err
        }
        if info.IsDir() {
            return nil
        }
        relPath, _ := filepath.Rel(folderPath, file)
        zipFileWriter, err := zipWriter.Create(relPath)
        if err != nil {
            return err
        }
        fileData, err := ioutil.ReadFile(file)
        if err != nil {
            return err
        }
        encryptedData, err := encrypt(fileData, key)
        if err != nil {
            return err
        }
        _, err = zipFileWriter.Write(encryptedData)
        return err
    })
    return err
}
// HTTP 处理器
func downloadHandler(w http.ResponseWriter, r *http.Request) {
    folderName := r.URL.Path[1:] // 获取请求路径中的文件夹名
    folderPath := filepath.Join("文件夹1", folderName) // 拼接文件夹路径
    zipFilePath := folderName + ".zip" // 创建临时 zip 文件名
    key, err := generateKey()
    if err != nil {
        http.Error(w, "无法生成密钥", http.StatusInternalServerError)
        return
    }
    err = zipFolder(folderPath, zipFilePath, key)
    if err != nil {
        http.Error(w, "无法压缩文件夹", http.StatusInternalServerError)
        return
    }
    // 设置下载文件的 Content-Disposition
    w.Header().Set("Content-Disposition", "attachment; filename=hidden.zip")
    w.Header().Set("Content-Type", "application/zip")
    http.ServeFile(w, r, zipFilePath)
    // 下载完成后删除临时文件
    os.Remove(zipFilePath)
}
func main() {
    http.HandleFunc("/", downloadHandler)
    log.Fatal(http.ListenAndServe(":8080", nil))
}
说明
[ol]
  • 生成密钥: 使用 generateKey 函数生成 AES 密钥。
  • 加密: encrypt 函数使用 AES 对文件数据进行加密。
  • 压缩文件夹: zipFolder 函数将指定文件夹中的文件压缩为 zip 文件并加密。
  • HTTP 处理: downloadHandler 函数处理 HTTP 请求,获取请求路径中的文件夹名,调用压缩函数并将生成的 zip 文件作为响应返回。
  • 隐藏文件名: 在 Content-Disposition 中使用 "hidden.zip" 作为下载的文件名。
    [/ol]
    使用方法
    [ol]
  • 将代码保存为 main.go。
  • 在终端中运行 go run main.go。
  • 访问 http://localhost:8080/a,服务器将返回加密后的压缩文件。
    [/ol]
  • netspirit
    OP
      


    pzx521521 发表于 2024-11-5 19:22
    能够隐藏文件名 不懂什么意思

    就是类似于winrar的加密文件名功能 打开压缩包必须输入密码才能看到文件名字的
    你提供的代码我也可以用ai去生成,但是我希望能够看一看有没有现成的软件。现成的软件肯定更加的完善。而且zip也不具有加密文件名的功能。。。。
    您需要登录后才可以回帖 登录 | 立即注册

    返回顶部