WebClient上传文件并存储在服务器上

WebClient UploadFile and Storing on the server

我有一个小型控制台应用程序,可以将文件上传到我的 Web 服务,两者都 运行 在我的 Windows 10 机器上本地。

将文件上传到网络服务的控制台应用程序代码:

using (var client = new WebClient())
{
    client.UploadProgressChanged += ...;
    client.UploadFileCompleted += ...;
    await client.UploadFileTaskAsync(wsURL, "POST", FilePath);
}

然后是web服务代码,将stream复制到一个新文件中:

[OperationContract]
[WebInvoke(Method = "POST")]
public bool Upload(Stream fs)
{
    using (var file = File.Open(NewFilePath, FileMode.OpenOrCreate, FileAccess.Write, FileShare.ReadWrite))
    {
        fs.CopyTo(file);
    }

    return true;
}

看起来文件上传正常,并且在 Web 服务上存储得很好,没有问题。

当我浏览到上传的副本(此时基本上复制到我机器上的另一个位置)并尝试打开文件时,它打不开。当我将原始文件的元数据与上传文件进行比较时,元数据在新文件中全部消失了。

我错过了什么?我尝试先将文件流读入 MemoryStream,然后再读入文件,仍然以正确的 size/content 长度保存文件,但没有元数据:

您正在尝试存储包含边界字节的文件流。

WebClient UploadFileAsync 源码看这里: https://referencesource.microsoft.com/#system/net/System/Net/webclient.cs 第 2389 行

尝试以下操作,干净地上传文件:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(URL);
request.ServicePoint.Expect100Continue = false;
request.Method = "POST";
request.ContentType = MimeMapping.GetMimeMapping(FilePath);

using (FileStream fs = new FileStream(FilePath, FileMode.Open, FileAccess.Read, FileShare.Read))
using(Stream requestStream = request.GetRequestStream())
{
    byte[] buffer = new byte[1024 * 4];
    int bytesLeft = 0;
    while((bytesLeft = fs.Read(buffer, 0, buffer.Length)) > 0)
    {
        requestStream.Write(buffer, 0, bytesLeft);
    }
}

using (var response = (HttpWebResponse)request.GetResponse())
using (var responseStream = response.GetResponseStream())
using (var sr = new StreamReader(responseStream))
{
    var responseString = sr.ReadToEnd();
}