首页 > 解决方案 > WebClient UploadFile 并存储在服务器上

问题描述

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

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

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

然后 Web 服务代码将流复制到一个新文件中:

[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;
}

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

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

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

在此处输入图像描述

标签: c#uploadmetadatawebclient

解决方案


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

在此处查看 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();
}

推荐阅读