Encoding.GetString()返回空字符串

时间:2016-04-26 21:54:53

标签: c# file-upload character-encoding

我正在尝试使用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),但结果相同。我在某处读过这可能是因为编码不当。如果是这个原因那么我该如何解决呢?我正在尝试发送的文件是从相机拍摄的视频。

感谢任何帮助。

1 个答案:

答案 0 :(得分: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的实例。

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

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

更新#3:

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