当前位置:编程学习 > 网站相关 >>

C# 对于含有中文名字的文件上传到swift不成功!!!!

"Error: http://192.168.1.234:1910/v1/AUTH_79da64e49d5249b7aa4f3d64991aafdd/年后 Unable to PUT InternalServerError" 返回 500的内部服务器错误。
swift对于object名字的约束是这样的:
Object名称约束
1.不能包含保留字符。官方文档上如是说,但没说哪些是保留字符,源码里也没找到 -。-;
2.经过UTF-8的URL-Encoded之后的字节 <= 1024。虽然官方文档上说,是经过URL编码之后的长度不能大于1024,但经实测发现,这个长度其实是UTF-8字节,URL-Encoded之后,一个汉字(%xx%xx%xx)算3个字节。

我C#代码里是这样对中文字符窜编码的:HttpSystem.Web.HttpUtility.UrlEncode(ObjectName)。符合上述情况的约束的。
所用到的Swift C#的接口是别人写的,在github下载:
            /// <summary>
    /// Puts the object.
    /// </summary>
    /// <returns>
    /// A <see name="Openstack.Swift.ObjectResponse"/>
    /// </returns>
    /// <param name='url'>
    /// The storage Url
    /// </param>
    /// <param name='token'>
    /// The Auth Token
    /// </param>
    /// <param name='container'>
    /// The container name
    /// </param>
    /// <param name='name'>
    /// The name of the object
    /// </param>
    /// <param name="contents">
    /// The contents of the object
    /// </param>
    /// <param name='headers'>
    /// Any custom headers needed for the request
    /// </param>
    /// <param name='query'>
    /// Any custom query strings needed for the request
    /// </param>
    public override ObjectResponse PutObject(string url, string token, string container, string name, Stream contents, Dictionary<string, string> headers, Dictionary<string, string> query)
{
var total_length = 0;
headers["X-Auth-Token"] = token;
var request = _http_factory.GetHttpRequest("PUT", url + '/' + _encode(container) + '/' + _encode(name), headers, query);
request.AllowWriteStreamBuffering = false;
//Default Content Length is -1 if one is not set.
//Lets Chunk Dat Body yo.
if (request.ContentLength == -1)
{
request.SendChunked = true;
}
var req_stream = request.GetRequestStream();
var buff = new byte[ChunkSize];
const int offset = 0;
        int read;
while((read = contents.Read(buff, offset, ChunkSize)) > 0)
{
    if (Progress != null)
    {
total_length += read;
Progress(total_length);
    }
req_stream.Write(buff, offset, read);
}
if (OperationComplete != null)
{
OperationComplete();
}
req_stream.Close();
contents.Close();
            var response = request.GetResponse();
response.Close();
return new ObjectResponse(response.Headers, response.Reason, response.Status, null);
}
在swift日志中是这样的错误记录,但是别人都是这样用的,我又不能说是swift源码的错



这个问题困扰了我几天了,因为查不出原因,忘那个大神指点指点。
分不多,希望见谅!!! Swift C# URL 对象 String --------------------编程问答-------------------- 求大神顶!!!! --------------------编程问答-------------------- 算了,自己解决了,一百分也没有人来回。。。。。 --------------------编程问答-------------------- 我也遇到了这个问题,请问LZ你是如何解决的? --------------------编程问答-------------------- 我也遇到了这个问题,请问LZ你是如何解决的? --------------------编程问答--------------------
引用 2 楼 WoAiCheDan 的回复:
算了,自己解决了,一百分也没有人来回。。。。。


怎么解决的? --------------------编程问答-------------------- 除
补充:云计算 ,  OpenStack
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,