发布时间:2024-12-23 05:40:47
在Golang中,我们经常需要发送和接收文件。有时候我们需要将文件从本地或其他服务器发送到客户端,有时候我们需要接收客户端上传的文件并进行处理。无论是发送还是接收文件,我们都可以使用Golang的http包来实现。
要发送文件到客户端,我们可以使用http包中的`ServeFile`函数。该函数会自动设置正确的Content-Type和Content-Disposition,并将指定的文件发送给客户端。以下是示例代码:
func handleDownload(w http.ResponseWriter, r *http.Request) {
filePath := "/path/to/file.txt"
http.ServeFile(w, r, filePath)
}
上面的代码会将指定路径下的文件发送给客户端。客户端会收到一个带有正确Content-Type和Content-Disposition的响应头,以及文件的内容。
如果你想手动设置Content-Type和Content-Disposition,可以使用http包中的`Header`方法。以下是示例代码:
func handleDownload(w http.ResponseWriter, r *http.Request) {
filePath := "/path/to/file.txt"
fileName := "file.txt"
// 打开文件
file, err := os.Open(filePath)
if err != nil {
http.Error(w, "Internal server error", http.StatusInternalServerError)
return
}
defer file.Close()
// 设置Content-Type
w.Header().Set("Content-Type", "text/plain")
// 设置Content-Disposition
w.Header().Set("Content-Disposition", "attachment; filename="+fileName)
// 将文件内容写入ResponseWriter
io.Copy(w, file)
}
上面的代码会手动设置Content-Type为text/plain,并将Content-Disposition设置为attachment,文件名为file.txt。
接收客户端上传的文件也很简单。我们可以使用http.Request的`FormFile`方法来获取上传的文件,然后处理它。以下是示例代码:
func handleUpload(w http.ResponseWriter, r *http.Request) {
// 获取上传的文件
file, handler, err := r.FormFile("file")
if err != nil {
http.Error(w, "Bad request", http.StatusBadRequest)
return
}
defer file.Close()
// 创建目标文件
dst, err := os.Create("/path/to/destination/file.txt")
if err != nil {
http.Error(w, "Internal server error", http.StatusInternalServerError)
return
}
defer dst.Close()
// 复制上传的文件到目标文件
io.Copy(dst, file)
// 返回成功响应
w.WriteHeader(http.StatusOK)
}
上面的代码会获取名为"file"的文件,并将其保存在指定的目标路径中。如果出现错误,会返回相应的错误响应码。
除了上述的示例代码,我们还可以对上传的文件进行一些额外的处理,比如验证文件类型、大小等。Golang提供了许多相关的库和工具,以便更好地控制文件上传功能。
通过Golang的http包,我们可以轻松地发送和接收文件。无论是发送还是接收,我们都可以根据需求进行定制和优化。上述示例代码展示了如何使用Golang的http包实现文件发送和接收功能,但仅供参考,实际使用中还需根据具体情况进行调整。