c# - 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;
}
看起来文件上传得很好,并且在网络服务上存储得很好,没有问题。
当我浏览到上传的副本(此时基本上复制到我机器上的另一个位置)并尝试打开文件时,它不会打开。当我将原始文件的元数据与上传的文件进行比较时,元数据都在新文件中消失了。
EXE
不会再打开了。JPG
无法使用 Windows 照片查看器或画图打开。仅在 Photoshop 中。PNG
似乎完全没有问题。
我错过了什么?我尝试先将文件流读入,然后再读入MemoryStream
文件,仍然以正确的大小/内容长度保存文件,但没有元数据:
解决方案
您正在尝试存储包含边界字节的文件流。
在此处查看 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();
}
推荐阅读
- python - TFLIte 无法设置张量:模型转换时尺寸不匹配
- python - 在灰度图像上使用 PIL putpixel 时,不了解有关新样式 getargs 的 SystemError
- javascript - UncaughtTypeError products.map 不是函数
- javascript - Javascript - 从 1,675 到 1,67 - 默认情况下,它会四舍五入到 1,68
- python - 在python中使用networkx计算无向图中大小为k的团的最佳方法是什么?
- java - 如何使用 Timeline 在 JavaFX 上每 x 秒执行一次 void 方法?
- json - 如何在使用 jq 维护结构的同时过滤 JSON 中的嵌套数组
- angular - Ionic4:错误是 InAppBrowser 中没有出现输出屏幕
- vim - 在另一个 ConEmu 选项卡中从 Vim 启动 ipdb
- dll - 我在windows上用lua5.1编译了ac lua extension dll,在lua命令行模式下运行良好,但是在openresty下无法使用