C# 七牛 断点续传 ResumablePutFile(string bucket, string key, string fname) 失败

C# 七牛 断点续传 ResumablePutFile(string bucket, string key, string fname) 失败

 public static void ResumablePutFile(string bucket, string key, string fname)
    {
        Console.WriteLine("\n===> ResumablePutFile {0}:{1} fname:{2}", bucket, key, fname);
        PutPolicy policy = new PutPolicy(bucket, 3600);
        string upToken = policy.Token();
        Settings setting = new Settings();
        ResumablePutExtra extra = new ResumablePutExtra();
        extra.Bucket = bucket;
        ResumablePut client = new ResumablePut(setting, extra);
        client.Progress += new Action<float>((p) =>
        {
            Console.WriteLine("当前进度:{0}%", p * 100);

        });
        client.PutFinished += new EventHandler<CallRet>((o, ret) =>
        {
            if (ret.OK)
            {
                Console.WriteLine("上传成功:{0}", ret.Response);

                if (File.Exists(fname))
                {
                    File.Delete(fname);
                }
            }
            else
            {
                Console.WriteLine("上传失败:{0}", ret.Response);
            }
        });
        client.PutFile(upToken, fname, Guid.NewGuid().ToString());
    }

调试代码进入 ret.OK ,但是七牛对应的空间没有,空间是私有,
图片上传(115.jpg),断点续传上传(key=116.jpg,但是上传后就变了“”) 结果图下图
请输入图片描述
application/octet-stream 还是一个字节流。
请问如何解决断点续传问题,并在上传完成之后 删除本地图片?

阅读 5.1k
1 个回答

这个示例代码有点问题,fix后的如下:

       public static void ResumablePutFile(string bucket, string key, string fname)
        {
            Console.WriteLine("\n===> ResumablePutFile {0}:{1} fname:{2}", bucket, key, fname);
            PutPolicy policy = new PutPolicy(bucket, 3600);
            string upToken = policy.Token();
            Settings setting = new Settings(); 
            ResumablePutExtra extra = new ResumablePutExtra();
            extra.MimeType = "image/jpeg";//设置文件的类型
            ResumablePut client = new ResumablePut(setting, extra);
            client.Progress += new Action<float>((p) =>
            {
                Console.WriteLine("当前进度:{0}%", p * 100);
           });
            client.PutFinished += new EventHandler<CallRet>((o, ret) =>
            {
                if (ret.OK)
                {
                    Console.WriteLine("上传成功:{0}", ret.Response);
                    if (File.Exists(fname))
                    {
                        //暂不能用,原因是由于此事件发布时文件资源未释放,可以在此函数外调用删除操作,或者fix sdk的源码,见下。
                        //File.Delete(fname);
                    }
                }
                else
                {
                    Console.WriteLine("上传失败:{0}", ret.Response);
                }
            });
            //fix
            client.PutFile(upToken, fname, key);
        }

        //Fix SDK source code to support delete file in the PutFinished event:

        public CallRet PutFile(string upToken, string localFile, string key)
        {
            PutAuthClient client = new PutAuthClient(upToken);
            CallRet ret;
            using (FileStream fs = File.OpenRead(localFile))
            {
                int block_cnt = block_count(fs.Length);
                fsize = fs.Length;
                chunks = fsize / extra.chunkSize + 1;
                extra.Progresses = new BlkputRet[block_cnt];
                //并行上传
                Parallel.For(0, block_cnt, (i) =>
                {
                    int readLen = BLOCKSIZE;
                    if ((i + 1) * BLOCKSIZE > fsize)
                        readLen = (int)(fsize - i * BLOCKSIZE);
                    byte[] byteBuf = new byte[readLen];
                    lock (fs)
                    {
                        fs.Seek(i * BLOCKSIZE, SeekOrigin.Begin);
                        fs.Read(byteBuf, 0, readLen);
                    }
                    BlkputRet blkRet = ResumableBlockPut(client, byteBuf, i, readLen);
                   if (blkRet == null)
                    {
                        extra.OnNotifyErr(new PutNotifyErrorEvent(i, readLen, "Make Block Error"));
                    }
                    else
                    {
                        extra.OnNotify(new PutNotifyEvent(i, readLen, extra.Progresses[i]));
                    }
                });
                if (string.IsNullOrEmpty(key))
                {
                    key = UNDEFINED_KEY;
                }
                ret = Mkfile(client, key, fs.Length);
            }
            if (ret.OK)
            {
                if (Progress != null)
                {
                    Progress(1.0f);
                }
                if (PutFinished != null)
                {
                    PutFinished(this, ret);
                }
            }
            else
            {
                if (PutFailure != null)
                {
                    PutFailure(this, ret);
                }
            }
            return ret;
        }
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
1 篇内容引用