golang http 发送文件

发布时间:2024-12-23 05:40:47

Golang Http 发送文件详解

在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包实现文件发送和接收功能,但仅供参考,实际使用中还需根据具体情况进行调整。

相关推荐