我有一个后端 go Fiber 服务器,它将使用 minio 客户端 sdk 提供从云服务获取的文件。我的目标是实现视频文件流,而不暴露与云 URL 的直接连接,并且视频必须是可向前和向后搜索的(与云 URL 的功能相同)。但是,当我添加从服务器发送的流时,无法搜索视频或者有时只能向后搜索。我尝试设置响应的内容长度、内容类型、内容范围等...但它不起作用。注意:所有行为都发生在 chrome 最新稳定版本中,而不是 firefox 或 postman 中。这是我的代码:
// c is the *fiber.Ctx
object, err := minioClient.GetObject(context.Background(), bucketName, fileName, minio.GetObjectOptions{})
if err != nil {
return err
}
objInfo, err := object.Stat()
if err != nil {
return err
}
buffer := make([]byte, objInfo.Size)
object.Read(buffer)
c.Set("Content-Length", fmt.Sprintf("%d", objInfo.Size))
c.Set("Content-Type", "video/mp4")
c.Set("Connection", "keep-alive")
c.Set("Content-Range", fmt.Sprintf("bytes 0-%d/%d", objInfo.Size, objInfo.Size))
c.Response().SetBodyStream(bytes.NewReader(buffer), int(objInfo.Size))
return nil
//c.SendStream just won't work
我已经找到解决办法了。结果我只需要添加 Accept-Ranges 标头哈哈。
在您的示例中,您不需要读取 Minio 的 GetObject 生成的对象并将其放入缓冲区中,只是为了创建另一个 Reader ...您可以使用它已经是 Stream 的对象...
这是使用
sendStream
的另一个建议:
func (api *MyRoute) GetObject(c *fiber.Ctx) error {
bucketName := c.Params("bucket", "")
objectName := c.Params("name", "")
//YOU SHOULD INTIALIZE YOUR MINIO CLIENT HERE
o, err := minioClient.GetObject(bucketName, objectName, minio.GetObjectOptions{})
if err != nil {
return err
}
stats, err := o.Stat()
if err != nil {
return err
}
return c.SendStream(o, int(stats.Size))
}