【问题标题】:Encoding.GetString() returns empty stringEncoding.GetString() 返回空字符串
【发布时间】:2016-04-26 21:54:52
【问题描述】:

我正在尝试使用 WebClient 将文件上传到服务器。我发布文件的代码如下:

        public void UploadMultipart(byte[] file, string filename, string contentType, string url)
    {
        var webClient = new WebClient();
        string boundary = "------------------------" + DateTime.Now.Ticks.ToString("x");
        webClient.Headers.Add("Content-Type", "multipart/form-data; boundary=" + boundary);
        var fileData = Encoding.UTF8.GetString(file);
        var package = string.Format("--{0}\r\nContent-Disposition: form-data; name=\"file\"; filename=\"{1}\"\r\nContent-Type: {2}\r\n\r\n{3}\r\n--{0}--\r\n", boundary, filename, contentType, fileData);

        var nfile = webClient.Encoding.GetBytes(package);

        byte[] resp = webClient.UploadData(url, "POST", nfile);
    }

Encoding.UTF8.GetString(file) 行总是返回一个空字符串。我检查了字节数组,它不是空的。我也试过Encoding.UTF8.GetString(file, 0, file.Length),但结果相同。我在某处读到这可能是因为编码不当。如果这是原因,那我该如何解决?我要发送的文件是从相机拍摄的视频。

感谢任何帮助。

【问题讨论】:

  • 你能发布一些文件[]数组的内容(十六进制或整数)吗?顺便说一句,GetString 中似乎有一些长度限制 - msdn.microsoft.com/en-us/library/744y86tc(v=vs.110).aspx。不知道如果 file[] > 2048 的行为 - 也可以返回空字符串 :) 检查文档中提供的示例
  • 调试器花费了非常长的时间。不知道为什么:(
  • @Kamen 好的,这就是数组的第一个字节的样子postimg.org/image/jeowmhhoh
  • Ahmed,0 字节表示它是一个NUL。字符串以\0 结尾,这也是相同的,以及为什么根据您的屏幕截图得到一个空字符串。您应该验证数据实际上是如何写入该数组的。一旦找到NUL(特定于编码),它将停止构建字符串,因为它认为它已经完成并防止溢出。
  • TyCobb 中间的那些值是什么?

标签: c# file-upload character-encoding


【解决方案1】:

代替

var fileData = Encoding.UTF8.GetString(file);

你应该使用

var fileData = Convert.ToBase64String(file, Base64FormattingOptions.InsertLineBreaks);

由于第二个参数,转换器将在字符串表示中每 76 个字符后插入换行符。

更新:

您可以尝试WebClient.UploadFile() 方法重载之一,如下所示:

public void UploadFile(string fileName, string url)
{
    var webClient = new WebClient();
    byte[] rawResponse = webClient.UploadFile(url, filename);
    string response = System.Text.Encoding.ASCII.GetString(rawResponse);
    Console.WriteLine(response);
}

更新 #2:

您可以尝试更新的 API:HttpClient.PostAsync(string, HttpContent)
string 参数是 Uri。
HttpContent 可以是 MultipartFormDataContent 的一个实例。

您可以使用 Add() 方法将 ByteArrayContent 的实例添加到 MultipartFormDataContent

也许这些会对您的需求有所帮助。

更新 #3:

以下是一些可能的解决方案:

【讨论】:

  • 数据不会转换为字符串。我在该行执行后在日志上看到了这一点:解析表达式时出错:发生了一个或多个错误。
  • 可能是数据文件有问题,但没有损坏或其他任何问题。我正在使用 File.ReadAllBytes 从存储位置获取数据。
  • 用另一种可能的解决方案更新了我的答案。
  • 可行,但我正在尝试发送多部分数据。基本上我想要实现的是发送一个字节数组和一个字符串。除了我上面实施的以外,还有什么可能的解决方案吗?我更喜欢使用 weClient,因为它可以方便地跟踪上传进度。
  • 感谢您的解决方案
猜你喜欢
  • 2020-01-27
  • 2020-07-11
  • 2015-05-25
  • 2011-05-09
  • 2012-07-20
  • 2011-12-15
  • 2020-11-23
  • 2015-12-21
  • 2013-09-02
相关资源
最近更新 更多