如果你想让上传的文件名由客户端指定而不是服务端获取,你可以通过修改前端代码来实现。在发送文件请求时,客户端可以在请求头中包含自定义的文件名。
前端示例代码(使用JavaScript):
function uploadFile() {
var fileInput = document.getElementById("fileInput");
var file = fileInput.files[0];
var filename = "custom_filename.jpg"; // 自定义文件名
var formData = new FormData();
formData.append("file", file, filename);
fetch("/upload", {
method: "POST",
body: formData
})
.then(response => response.text())
.then(data => {
console.log(data);
})
.catch(error => {
console.error(error);
});
}
这段代码中,我们将上传的文件与自定义的文件名一起作为FormData的一部分,并通过fetch函数发送POST请求到服务器上的”/upload”路径。
后端处理代码(Go):
func handlerUpload(w http.ResponseWriter, r *http.Request) {
r.ParseMultipartForm(32 << 20) // 解析 multipart 表单,限制最大文件大小为 32MB
file, _, err := r.FormFile("file") // 获取上传的文件
if err != nil {
http.Error(w, "Fail to receive file", http.StatusBadRequest)
return
}
defer file.Close() // 在函数结束时关闭文件句柄
filename := r.Header.Get("X-File-Name") // 获取自定义的文件名
if filename == "" {
http.Error(w, "No custom filename specified", http.StatusBadRequest)
return
}
dst, err := os.Create(filename) // 在服务器上创建一个与自定义文件名相同的空文件
if err != nil {
http.Error(w, "Failed to create file on server", http.StatusInternalServerError)
return
}
defer dst.Close() // 在函数结束时关闭目标文件句柄
_, err = io.Copy(dst, file) // 将上传的文件内容拷贝到目标文件中
if err != nil {
http.Error(w, "Failed to save file on server", http.StatusInternalServerError)
return
}
fmt.Fprintln(w, "Upload successful") // 向客户端返回一个简单的响应消息
}
在这段代码中,我们通过r.Header.Get("X-File-Name")获取请求头中的”X-File-Name”字段作为自定义的文件名。
请注意,在修改代码时要确保前后端保持一致,并进行必要的安全性和错误处理。
内容由零声教学AI助手提供,问题来源于学员提问




