当前位置: 首页 > news >正文

cms网站开发涉及的知识2019年最好的国外vps

cms网站开发涉及的知识,2019年最好的国外vps,python合适做网站吗,保定企业网站的建设golang实现可中断的流式下载 最近有一个需要实现下载功能: 从服务器上读取文件,返回一个ReadCloser在用户磁盘上创建文件,通过io.Copy实现文件下载(io.Copy是流式的操作,不会出现因文件过大而内存暴涨的问题&#xff0…

golang实现可中断的流式下载

最近有一个需要实现下载功能:

  1. 从服务器上读取文件,返回一个ReadCloser
  2. 在用户磁盘上创建文件,通过io.Copy实现文件下载(io.Copy是流式的操作,不会出现因文件过大而内存暴涨的问题)
  3. 通过context实现暂停

1 流式下载:io.Copy

这里拷贝文件我们选择的是io.Copy而非是通过ioutil.ReadAll()将body中返回的数据一次性读取到内存

通过io.Copy可以保证内存占用一直处于一个比较稳定的水平

2 可中断:context

通过封装io.Copy实现

  • 将io.Copy封装为一个方法,方法里传入context,外部通过context.WithCancel()控制流式拷贝的暂停

3 全部代码

这里演示我通过读取S3的一个对象下载到本地


/*通过io.Copy实现可中断的流复制
*/
var (ak       = "99999999999999999999"sk       = "9999999999999999999999999999999999999999"endpoint = "http://xx.xx.xx.xx:8060"bucket   = "test-bucket"key      = "d_xp/2G/2G.txt"
)func main() {s3Client := osg.Client.GetS3Client(ak, sk, endpoint)ctx, cancelFunc := context.WithCancel(context.Background())object, err := s3Client.GetObject(ctx, &s3.GetObjectInput{Bucket: aws.String(bucket),Key:    aws.String(key),})go func() {time.Sleep(time.Second * 10)cancelFunc()log.Infof("canceled...")}()if err != nil {log.Errorf("%v", err)return}body := object.Bodydefer body.Close()file, err := os.Create("/Users/ziyi/GolandProjects/MyTest/demo_home/io_demo/target.txt")if err != nil {log.Errorf("%v", err)return}defer file.Close()_, err = FileService.Copy(ctx, file, body)if err != nil {log.Errorf("%v", err)return}}type fileService struct {sem *semaphore.Weighted
}var FileService = &fileService{sem: semaphore.NewWeighted(1),
}type IoCopyCancelledErr struct {errMsg string
}func (e *IoCopyCancelledErr) Error() string {return fmt.Sprintf("io copy error, %s", e.errMsg)
}func NewIoCopyCancelledErr(msg string) *IoCopyCancelledErr {return &IoCopyCancelledErr{errMsg: msg,}
}type readerFunc func(p []byte) (n int, err error)func (rf readerFunc) Read(p []byte) (n int, err error) { return rf(p) }//通过ctx实现可中断的流拷贝
// Copy closable copy
func (s *fileService) Copy(ctx context.Context, dst io.Writer, src io.Reader) (int64, error) {// Copy will call the Reader and Writer interface multiple time, in order// to copy by chunk (avoiding loading the whole file in memory).// I insert the ability to cancel before read time as it is the earliest// possible in the call process.size, err := io.Copy(dst, readerFunc(func(p []byte) (int, error) {select {// if context has been canceledcase <-ctx.Done():// stop process and propagate "context canceled" errorreturn 0, NewIoCopyCancelledErr(ctx.Err().Error())default:// otherwise just run default io.Reader implementationreturn src.Read(p)}}))return size, err
}
http://www.yayakq.cn/news/759886/

相关文章:

  • 济南网站建设力推搜点网络ok郴州网站制作公司招聘
  • 电子商务网站开发设计案例—易趣网电子商务网站seo引擎优化专员
  • 建设内部网站wordpress上传pdf文档
  • jquery购物网站网站备案接入商
  • 用老域名做网站还是新域名wordpress标签关注
  • 定制网站开发公司排名人工智能培训机构哪个好
  • 网站 在百度搜索不到整站优化seo排名点击
  • 郴州网站seo优化指定网站建设前期规划方案
  • 耐思尼克网站阿里云域名购买流程
  • 做投融资平台的网站都有哪些怎么进入追信魔盒网站开发软件
  • 佛山市网站建设 骏域动力50万做网站
  • 设计网站要多久如何自建网站 优帮云
  • 极简 网站模板中国室内设计联盟app
  • 精品课程网站建设意义wordpress图文安装
  • 所得税 网站建设费佛山营销网站建设制作
  • 找做金融的网站公众号开发者密钥有什么用
  • 社区门户网站建设招标公告设计之家海报
  • 青岛seo建站深圳中装建设
  • 北京 顺义 网站制作wordpress 高可用
  • 做电梯销售从哪些网站获取信息婚庆类的模板网站
  • 做做网站入口云南工贸网站建设
  • 如何用jeecg建设网站兰溪做网站哪家好
  • 淮南建网站公司百度关键词规划师入口
  • c 做网站网页设计程序代码
  • 连接国外网站的app网页设计论文题目大全
  • 云南建设厅建筑业管理网站成都和奇乐网站建设公司怎么样
  • 制作网站的技术律师事务所手机网站
  • 学前端要逛那些网站做空比特币网站
  • 网站搭建素材群自建站怎么搭建
  • 宁波企业网站建设大宗商品交易平台政策