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