开发者社区> 问答> 正文

C# 浏览器直接上传

最近需要用到浏览器端到OSS服务器的直接上传下载功能。用C#做了个demo,代码如下:               try
            {
                ObjectMetadata metadata = new ObjectMetadata();
                // 可以设定自定义的metadata。
                metadata.UserMetadata.Add("myfield", "test");


                OssClient ossClient = new OssClient(new Uri("http://oss-cn-qingdao.aliyuncs.com/"), accessId, accessKey); // 青岛数据中心  


                //OssClient ossClient = new OssClient(accessId, accessKey); // 杭州数据中心  
                //*
                //<-----------------------------URL Start--------------------------------
                AccessControlList accs = ossClient.GetBucketAcl(bucketName);


                string imgurl = string.Empty;


                SignHttpMethod method = new SignHttpMethod();
                if(methodType == 0) // 根据传入参数判断生成胡 uri类型
                    method = SignHttpMethod.Get;
                else
                    method = SignHttpMethod.Put;
                //if (!accs.Grants.Any())
                {
                    GeneratePresignedUriRequest request = new GeneratePresignedUriRequest(bucketName, key, method);
                    
                    int time = 0;
                    int.TryParse(delaytime, out time);
                    request.Expiration = DateTime.Now.AddSeconds(time); // 有效时间 ,单位 秒


                    imgurl = ossClient.GeneratePresignedUri(request).AbsoluteUri;


                    MessageBox.Show("方法为:" method " 有效时间为(秒):=" time);
                }
                // else
                {
                    // imgurl = string.Format("http://{0}.oss.aliyuncs.com/{1}", bucketName, key);
                }


                //context.Response.Write(String.Format("{0}|{1}|{2}|{3}", imgurl, imgurl, imgurl, key));
                //------------------------------URL END---------------------------------->
                //*/
                return imgurl.ToString();
            }
            catch (AggregateException ex)
            {
                throw ex;
            }
下载功能都正常,但是上传得时候老是返回

<Error>

<Code>SignatureDoesNotMatch</Code>
<Message>The request signature we calculated does not match the signature you provided. Check your key and signing method.</Message>
<StringToSignBytes>47 45 54 0A 0A 0A 31 33 39 33 32 30 35 33 38 35 0A 2F 73 69 75 69 62 75 63 6B 65 74 31 2F 31 32 33 2E 74 78 74</StringToSignBytes>
<SignatureProvided>aN3L9ODePhNqQoIHrrtThVEaHUo=</SignatureProvided>
<StringToSign>GET 1393205385 /siuibucket1/123.txt</StringToSign>
<OSSAccessKeyId>QAWi14lIVk1DI3pp</OSSAccessKeyId>
<RequestId>530AA056236AAA280251D094</RequestId>
<HostId>siuibucket1.oss-cn-qingdao.aliyuncs.com</HostId>
</Error>
求解释?从代码能看到,上传下载都是用了同一个流程来签名,SignatureDoesNotMatch怎么会单单上传出现这个问题?
注:由于没有指定上传文件本地路径,我的上传文件和我的exe放在一个目录

展开
收起
丹李 2014-02-24 10:12:42 13343 0
5 条回答
写回答
取消 提交回答
  • ReC# 浏览器直接上传
    取得的URI不要使用toString()来取得URL字符串,,要使用:uri.OriginalString属性来取得字符串即可!
    2014-09-24 22:36:15
    赞同 展开评论 打赏
  • ReC# 浏览器直接上传
    浏览器上传,应该直接用POST功能啊。见API文档,
    5.4.7     Post Object ............................................................................... 93
    基本原理和签名的方式差不多,但是有更多灵活性。用户可以通过表单来提交,但是只能根据开发者设定的Policy来上传。
    HTML实例见:
    http://bbs.aliyun.com/read/157585.html?spm=0.0.0.0.B0XkKR
    2014-06-12 11:26:49
    赞同 展开评论 打赏
  • ReC# 浏览器直接上传
    计算的签名需要重新编码一下,如果里面出现了+就会抛出这个异常
    这个事SDK 的问题
    HttpUtility.UrlEncode(签名参数, Encoding.UTF8)
    2014-06-11 09:12:32
    赞同 展开评论 打赏
  • LT是个伪程序员
    浏览器上传的话,直接用ossClient.PutObject就好了。
    2014-04-29 00:05:08
    赞同 展开评论 打赏
  • ReC# 浏览器直接上传
    另外,我用的是免费试用版,不知道和这个有没有关系

    -------------------------

    ReC# 浏览器直接上传
    看到论坛里有用php实现的例子,是不是C#的GeneratePresignedUriRequest(String, String, SignHttpMethod)接口有问题啊有问题啊

    -------------------------

    ReC# 浏览器直接上传
    另外如何指定本地上传文件路径了 ?
    2014-02-24 10:14:11
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
基于浏览器的实时构建探索之路 立即下载
WEB浏览器中即将发生的安全变化 立即下载
低代码开发师(初级)实战教程 立即下载