如何利用MySQL和Go語言開發一個簡單的檔案下載功能
#概述:
檔案下載功能是許多網路應用程式的常見需求之一。本文將介紹如何使用MySQL和Go語言開發一個簡單且可靠的檔案下載功能。我們將使用MySQL來儲存檔案相關的元數據,如檔案名稱、路徑和大小,而Go語言將用於處理檔案下載請求和提供下載服務。
步驟:
可以使用下列SQL語句來建立表格:
CREATE TABLE files (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255),
path VARCHAR(255 ),
size INT
);
func uploadHandler(w http.ResponseWriter, r *http.Request) { file, handler, err := r.FormFile("file") if err != nil { // 处理错误 http.Error(w, err.Error(), http.StatusInternalServerError) return } defer file.Close() // 保存文件到服务器 path := "/path/to/save/files/" + handler.Filename f, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE, 0666) if err != nil { // 处理错误 http.Error(w, err.Error(), http.StatusInternalServerError) return } defer f.Close() io.Copy(f, file) // 将文件元数据插入数据库 size := handler.Size name := handler.Filename insertSQL := "INSERT INTO files (name, path, size) VALUES (?, ?, ?)" _, err = db.Exec(insertSQL, name, path, size) if err != nil { // 处理错误 http.Error(w, err.Error(), http.StatusInternalServerError) return } fmt.Fprintf(w, "文件上传成功") }
以下是處理文件下載請求的範例程式碼:
func downloadHandler(w http.ResponseWriter, r *http.Request) { id := r.URL.Query().Get("id") // 根据文件id查询文件元数据 querySQL := "SELECT name, path, size FROM files WHERE id = ?" var name, path string var size int64 err := db.QueryRow(querySQL, id).Scan(&name, &path, &size) if err != nil { // 处理错误 http.Error(w, err.Error(), http.StatusInternalServerError) return } // 打开文件 file, err := os.Open(path) if err != nil { // 处理错误 http.Error(w, err.Error(), http.StatusInternalServerError) return } defer file.Close() // 设置响应头 w.Header().Set("Content-Disposition", fmt.Sprintf("attachment; filename=%s", name)) w.Header().Set("Content-Type", "application/octet-stream") w.Header().Set("Content-Length", fmt.Sprintf("%d", size)) // 发送文件数据给用户 io.Copy(w, file) }
func main() { // 连接MySQL数据库 db, err := sql.Open("mysql", "user:password@tcp(localhost:3306)/database") if err != nil { log.Fatal(err) } defer db.Close() // 注册路由处理函数 http.HandleFunc("/upload", uploadHandler) http.HandleFunc("/download", downloadHandler) // 启动HTTP服务器 log.Fatal(http.ListenAndServe(":8080", nil)) }
綜上所述,我們透過MySQL儲存檔案元數據,並使用Go語言處理檔案上傳和下載請求,實作了一個簡單的檔案下載功能。以上程式碼範例提供了一個基本框架,你可以根據實際需求進行適當的修改和擴展。希望本文對你開發文件下載功能有幫助!
以上是如何利用MySQL和Go語言開發一個簡單的檔案下載功能的詳細內容。更多資訊請關注PHP中文網其他相關文章!