Home  >  Article  >  Database  >  How to develop a simple file download function using MySQL and Go language

How to develop a simple file download function using MySQL and Go language

PHPz
PHPzOriginal
2023-09-20 10:21:181404browse

How to develop a simple file download function using MySQL and Go language

How to use MySQL and Go language to develop a simple file download function

Overview:
The file download function is one of the common requirements of many web applications. This article will introduce how to use MySQL and Go language to develop a simple and reliable file download function. We will use MySQL to store file-related metadata, such as file name, path, and size, and the Go language will be used to handle file download requests and provide download services.

Steps:

  1. Database design
    First, we need to design a database to store the metadata of the file. We can create a table named "files" with the following fields:
  2. id: the unique identifier of the file, you can use a self-increasing integer or UUID as the primary key.
  3. name: File name, stored in VARCHAR or TEXT type.
  4. path: File storage path, stored in VARCHAR or TEXT type.
  5. size: File size, stored using integer type.

You can use the following SQL statement to create a table:
CREATE TABLE files (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255),
path VARCHAR(255 ),
size INT
);

  1. File upload
    In a web application, users can upload files to the server through the upload file form. Here we use the net/http library of Go language to handle file upload requests. The following is a sample code to handle a file upload request:
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, "文件上传成功")
}
  1. File Download
    Now, we can implement the file download function. The user downloads the file by sending a GET request. We need to find the relevant information of the file based on the file's id and send the file content to the user.

The following is a sample code to handle a file download request:

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)
}
  1. Start the Web server
    Finally, we need to write a simple main function to start the Web server and Listen for file upload and download requests.
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))
}

To sum up, we use MySQL to store file metadata, and use Go language to process file upload and download requests, implementing a simple file download function. The above code examples provide a basic framework that you can modify and extend appropriately according to actual needs. I hope this article will help you develop a file download function!

The above is the detailed content of How to develop a simple file download function using MySQL and Go language. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn