@@ -46,6 +46,8 @@ C# SDK引用了第三方的开源项目[Json.NET](http://www.newtonsoft.com/json
4646* [ QSunSync] ( https://github.com/qiniu/QSunSync )
4747* [ QiniulaLab] ( https://github.com/qiniu/qiniulab )
4848
49+ 您也可以参考官方文档 [ C# SDK 使用指南] ( http://developer.qiniu.com/code/v7/sdk/csharp.html )
50+
4951####上传文件
5052
5153#####上传流程
@@ -54,33 +56,132 @@ C# SDK引用了第三方的开源项目[Json.NET](http://www.newtonsoft.com/json
5456
5557#####普通上传
5658
57- 使用UploadManager,以下代码示意了如何使用UploadManager来上传一个本地文件
58-
59- // Let's begin
60- UploadManager mgr = new UploadManager();
61-
62- // PutPolicy
63- PutPolicy putPolicy = new PutPolicy();
64- putPolicy.Scope = Settings.Bucket;
65- // 上传策略有效时间(建议时间3600秒)
66- putPolicy.SetExpires(3600);
67- // 过期(上传完毕1天后)自动删除
68- putPolicy.DeleteAfterDays = 1;
69-
70- // UploadToken
71- Mac mac = new Mac(Settings.AccessKey, Settings.SecretKey);
72- string token = Auth.createUploadToken(putPolicy, mac);
73-
74- string saveKey = "test_UploadManagerUploadFile.png";
75- string localFile = "F:\\test.png";
76-
77- // Do it!
78- mgr.uploadFile(localFile, saveKey, token, null, null);
59+ 推荐使用UploadManager,以下代码示意了如何使用UploadManager来上传一个本地文件
60+
61+ using System;
62+ using Qiniu.Util;
63+ using Qiniu.Storage;
64+ using System.IO;
65+
66+ namespace ConsoleDemo
67+ {
68+ class SimpleUploadDemo
69+ {
70+ public static void Main(string[] args)
71+ {
72+ string AK = "ACCESS_KEY";
73+ string SK = "SECRET_KEY";
74+ // 目标空间名
75+ string bucket = "TARGET_BUCKET";
76+ // 目标文件名
77+ string saveKey = "SAVE_KEY";
78+ // 本地文件
79+ string localFile = "LOCAL_FILE";
80+
81+ // 上传策略
82+ PutPolicy putPolicy = new PutPolicy();
83+ // 设置要上传的目标空间
84+ putPolicy.Scope = bucket;
85+ // 上传策略的过期时间(单位:秒)
86+ putPolicy.SetExpires(3600);
87+ // 文件上传完毕后,在多少天后自动被删除
88+ putPolicy.DeleteAfterDays = 1;
89+
90+ Mac mac = new Mac(AK,SK); // Use AK & SK here
91+ // 生成上传凭证
92+ string uploadToken = Auth.createUploadToken(putPolicy, mac);
93+
94+ UploadOptions uploadOptions = null;
95+
96+ // 上传完毕事件处理
97+ UpCompletionHandler uploadCompleted = new UpCompletionHandler(OnUploadCompleted);
98+
99+ // 方式1:使用UploadManager
100+ //默认设置 Qiniu.Common.Config.PUT_THRESHOLD = 512*1024;
101+ //可以适当修改,UploadManager会根据这个阈值自动选择是否使用分片(Resumable)上传
102+ UploadManager um = new UploadManager();
103+ um.uploadFile(localFile, saveKey, token, uploadOptions, uploadCompleted);
104+
105+ // 方式2:使用FormManager
106+ //FormUploader fm = new FormUploader();
107+ //fm.uploadFile(localFile, saveKey, token, uploadOptions, uploadCompleted);
108+
109+ Console.ReadKey();
110+ }
111+
112+ private static void OnUploadCompleted(string key, ResponseInfo respInfo, string respJson)
113+ {
114+ // respInfo.StatusCode
115+ // respJson是返回的json消息,示例: { "key":"FILE","hash":"HASH","fsize":FILE_SIZE }
116+ }
117+ }
118+ }
79119
80120
81121#####断点续上传
82122
83- 使用ResumeUploader,可参考examples/ResumableUpload.cs代码
123+ 使用ResumeUploader,可参考examples/ResumableUpload.cs代码。
124+
125+ using System;
126+ using Qiniu.Util;
127+ using Qiniu.Storage;
128+ using System.IO;
129+
130+ namespace ConsoleDemo
131+ {
132+ class ResumableUploadDemo
133+ {
134+ public static void Main(string[] args)
135+ {
136+ string AK = "ACCESS_KEY";
137+ string SK = "SECRET_KEY";
138+ string bucket = "TARGET_BUCKET";
139+ string saveKey = "SAVE_KEY";
140+ string localFile = "LOCAL_FILE";
141+ // 上传进度记录保存的目录
142+ string recordPath = "RECORD_PATH";
143+ // 上传进度保存为文件
144+ string recordFile = "RECORD_FILE";
145+
146+ UploadOptions uploadOptions = new UploadOptions(
147+ null, // ExtraParams
148+ null, // MimeType
149+ false, // CheckCrc32
150+ new UpProgressHandler(OnUploadProgressChanged), // 上传进度
151+ null // CancelSignal
152+ );
153+
154+ UpCompletionHandler uploadCompleted = new UpCompletionHandler(OnUploadCompleted); // 上传完毕
155+
156+ // 上传时会将当前进度记录写到文件,下次可以“断点续传”
157+ ResumeRecorder rr = new ResumeRecorder(recordPath);
158+ // 开始上传
159+ ResumeUploader ru = new ResumeUploader(
160+ rr, // 续传记录
161+ recordFile, // 续传记录文件
162+ localFile, // 待上传的本地文件
163+ saveKey, // 要保存的文件名
164+ token, // 上传凭证
165+ uploadOptions, // 上传选项(其中包含进度处理),可为null
166+ uploadCompleted // 上传完毕事件处理
167+ );
168+
169+ ru.uploadFile();
170+ Console.ReadKey();
171+ }
172+
173+ private static void OnUploadProgressChanged(string key,double percent)
174+ {
175+ // percent = [0(开始)~1.0(完成)]
176+ }
177+
178+ private static void OnUploadCompleted(string key,ResponseInfo respInfo,string respJson)
179+ {
180+ // respInfo.StatusCode
181+ // respJson是返回的json消息,示例: { "key":"FILE","hash":"HASH","fsize":FILE_SIZE }
182+ }
183+ }
184+ }
84185
85186####文件下载
86187
@@ -114,22 +215,59 @@ C# SDK引用了第三方的开源项目[Json.NET](http://www.newtonsoft.com/json
114215支持stat、copy、move、delete,listFiles等,具体可参阅BucketManager模块说明。
115216
116217######关于获取空间文件列表(listFiles)的说明:
117-
118- METHOD: listFiles(bucket, prefix, marker, limit, delimiter)
119- -----------------------------------------------------------------------
120- bucket: 目标空间名称
121- prefix: 返回指定文件名前缀的文件列表(prefix可设为null)
122- marker: 考虑到设置limit后返回的文件列表可能不全(需要重复执行listFiles操作)
123- 执行listFiles操作时使用marker标记来追加新的结果
124- 特别注意首次执行listFiles操作时marker为null
125- limit: 每次返回结果所包含的文件总数限制(limit<=1000,建议值100)
126- delimiter: 分隔符,比如-或者/等等,可以模拟作为目录结构(参考下述示例)
127- 假设指定空间中有2个文件 fakepath/1.txt fakepath/2.txt
128- 现设置delimiter=/ 得到结果items =[],commonPrefixes = [fakepath/]
129- 调整prefix=fakepath/ delimiter=null 得到所需结果items=[1.txt,2.txt]
130- 于是可以在本地先创建一个目录fakepath,然后在该目录下写入items中的文件
131218
219+ 在BucketManager类中提供了listFiles方法` listFiles(bucket, prefix, marker, limit, delimiter) ` .
220+
221+ 该方法返回值中,有以下3个字段需要关注:
222+
223+ | 字段 | 含义 |
224+ | -----| -----|
225+ | Marker | 请参阅下述的` marker ` 参数 |
226+ | Items | 返回的结果,其中包括文件名、hash、大小等信息 |
227+ | CommonPrefixes | 请参阅下述的` delimiter ` 和` prefix ` 参数 |
132228
229+ 函数参数说明如下:
230+
231+ | 参数 | 含义 |
232+ | --------| --------|
233+ | bucket| 目标空间名称|
234+ | prefix| 返回指定文件名前缀的文件列表(prefix可设为null)|
235+ | marker| 考虑到设置limit后返回的文件列表可能不全(需要重复执行listFiles操作) 执行listFiles操作时使用marker标记来追加新的结果。** 特别注意** 首次执行listFiles操作时marker为null|
236+ | limit| 每次返回结果所包含的文件总数限制(limit<=1000,* 建议值100* )|
237+ | delimiter| 分隔符,比如-或者/等等,可以模拟作为目录结构(参考下述示例)。假设指定空间中有2个文件 fakepath/1.txt fakepath/2.txt 现设置delimiter=/ 得到结果items =[ ] ,commonPrefixes = [ fakepath/] 调整prefix=fakepath/ delimiter=null 得到所需结果items=[ 1.txt,2.txt] 于是可以在本地先创建一个目录fakepath,然后在该目录下写入items中的文件|
238+
239+
240+ 以下是一个简单的示例:
241+
242+ // AK = "ACCESS_KEY"
243+ // SK = "SECRET_KEY"
244+ Mac mac = new Mac(AK, SK);
245+ BucketManager bm = new BucketManager(mac);
246+
247+ string bucket = "BUCKET"; // 目标空间
248+ string marker = ""; // 首次请求时marker必须为空
249+ string prefix = null; // 按文件名前缀保留搜索结果
250+ string delimiter = null; // 目录分割字符(比如"/")
251+ int limit = 100; // 最大值1000
252+
253+ // 返回结果存储在items中
254+ List<FileDesc> items = new List<FileDesc>();
255+
256+ // 由于limit限制,可能需要执行多次操作
257+ // 返回值中Marker字段若非空,则表示文件数超过了limit
258+ do
259+ {
260+ var result = bm.listFiles(bucket, prefix, marker, limit, delimiter);
261+ marker = result.Marker;
262+ if (result.Items != null)
263+ {
264+ items.AddRange(result.Items);
265+ }
266+ } while (!string.IsNullOrEmpty(marker));
267+
268+ // 在这里处理文件列表items
269+
270+ 完整示例及其它更多代码可以参考SDK的[ examples目录] ( https://github.com/qiniu/csharp-sdk/tree/master/examples )
133271
134272#####批量处理
135273
0 commit comments