0

我在我的 wp7 应用程序的客户端将图像转换为字节数组,然后将其发送到 Web 服务(服务器),代码如下所示--->

客户端

private void SendImage(byte[] data, long UserID)
{
    Uri uri = new Uri("some uri");
    IDictionary<string, object> bytesToSend = new Dictionary<string, object>();
    bytesToSend.Add("ImageBytes", Convert.ToBase64String(data));
    PostClient post = new PostClient(bytesToSend);
    post.DownloadStringAsync(uri);
}

服务器端

[HttpPost]
public bool SaveImage(object ImageBytes, Int64 UserID = 1)
{
    string ImgStr = ((string[])(ImageBytes))[0];
    byte[] ImgBytes = Convert.FromBase64String(ImgStr); ///<----///ERROR
    Image ItemImage;
    using (MemoryStream ms = new MemoryStream(ImgBytes))
    {
        ItemImage = Image.FromStream(ms);
    }
    PostUserItems(ItemImage);
    return true;
}

但在接收端发生错误

基数 64 字符数组的长度无效

4

3 回答 3

0

您的数据以字符串的形式出现,而不是字符串 []。你可以修复演员表,所以而不是

string ImgStr = ((string[])(ImageBytes))[0];

string ImgStr = (string)ImageBytes;

如果可以,请更改函数声明,因为您的函数需要 a String,而不是Object.

public bool SaveImage(String ImgStr, Int64 UserID = 1)
{
    byte[] ImgBytes = Convert.FromBase64String(ImgStr);
    // ...
}
于 2013-03-30T13:57:56.827 回答
0

base64 编码字符串的长度始终是 4 的倍数。如果它不是 4 的倍数,则追加 = 字符,直到它是。?name=value 形式的查询字符串在值包含 = 字符时会出现问题(其中一些将被删除,我不记得确切的行为)。在进行 base64 解码之前,您可能可以通过附加正确数量的 = 字符来摆脱困境。

编辑 1

您可能会发现 UserNameToVerify 的值已将“+”更改为“”,因此您可能需要这样做;

a = a.Replace(" ","+"); 这应该得到正确的长度;

int mod4 = a.Length % 4; 如果 ( mod4 > 0 )

{

a += 新字符串('=', 4 - mod4 );

}

当然,调用 UrlEncode(如 LukeH 的回答)应该让这一切变得毫无意义。

于 2017-02-28T08:40:47.597 回答
-1

我已经看到这个错误是由大小合适的视图状态和过度激进的内容过滤设备/防火墙(尤其是在与 K-12 教育机构打交道时)的组合引起的。

我们通过将 Viewstate 存储在 SQL Server 中来解决这个问题。在走这条路之前,我建议尝试通过不在其中存储任何大的东西并为所有不需要它的控件关闭它来限制您对视图状态的使用。

在 SQL Server 中存储 ViewState 的参考资料:MSDN - PageStatePersister ASP 联盟概述 - SQL Server 代码项目中存储视图状态的简单方法 - ViewState Provider Model

于 2017-02-28T08:07:39.107 回答