如何在 C# 中正确使用 WCF REST API 上的 Stream 将文件(图像/视频/等)上传到服务器?
Posted
技术标签:
【中文标题】如何在 C# 中正确使用 WCF REST API 上的 Stream 将文件(图像/视频/等)上传到服务器?【英文标题】:How to upload files(images/videos/etc) to server using Stream on WCF REST API in C# properly? 【发布时间】:2019-07-09 13:55:17 【问题描述】:我正在设置一个函数来使用 WCF REST API 在服务器上上传图像/视频。文件已成功上传到正确的目标文件夹,但无论是哪种文件,它们最终都变得无法读取。
我的代码(尤其是 FileStream-Write 部分)是否有问题导致这种情况发生?或者问题可能出在其他地方(例如 Web.config 文件)?
这是我的代码 sn-p:
public string uploadFile(Stream fileStream)
String fileName = System.Web.HttpContext.Current.Request.QueryString["fileName"];
String destFileName = HHCWCFApp.Properties.Settings.Default.TemporaryFilePath + fileName;
String destLink = HHCWCFApp.Properties.Settings.Default.Hyperlink + fileName;
try
int length = 256;
int bytesRead = 0;
Byte[] buffer = new Byte[length];
using (FileStream fs = new FileStream(destFileName, FileMode.Create))
do
bytesRead = fileStream.Read(buffer, 0, length);
fs.Write(buffer, 0, bytesRead);
while (bytesRead == length);
fileStream.Dispose();
catch (Exception ex)
Console.WriteLine(ex.ToString());
if (File.Exists(destFileName))
return destLink;
else
return "Not Found";
【问题讨论】:
您需要转换为 64 位字符串。 Http 不允许二进制数据(图像),因此您必须转换为 64 位字符串,该字符串将非法二进制 http 字符转换为有效的 ascii 字符。 @jdweng 我可以问一下将文件转换为 64 位字符串的例子吗?我也应该把那部分代码放在那个函数中吗?这也适用于上传视频吗?视频文件有可能最大为 40 MB。 有4种方法:1) Convert.ToBase64String(string) 2) Convert.ToBase64String(byte[]) 3) Convert.FromBase64String(string) 4) Convert.FromBase64String(byte[]) 【参考方案1】:您要上传什么类型的文件?较大的文件可能会违反最大请求长度,这在 Web 配置中设置如下
<configuration>
<system.web>
<httpRuntime maxRequestLength="xxxx" />
</system.web>
尝试一个只有几 kb 的文本文件,如果可行,但较大的文件不可行,那么这可以很好地解决问题。我测试了你的代码,没有问题。
还请记住,您使用的 IIS 服务器也可能设置了最大请求长度,这可能会覆盖您的值。
默认长度为 4mb,您可以编写一个函数来检索该值,以便您的客户端/调用代码可以检查它要传递的文件是否超过最大大小。
请阅读 Microsoft 页面上的 here 了解更多信息。
编辑:第一次误读代码,道歉
【讨论】:
据我了解,FileStream 每次在 do-while 中循环时都会写入或上传总文件大小的 256 个字节,直到达到文件的总大小......我误解了什么在这里?以上是关于如何在 C# 中正确使用 WCF REST API 上的 Stream 将文件(图像/视频/等)上传到服务器?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 WCF Rest Service 中传递多个参数:C# 中的字符串和流
在 C# 中,将附件发布到 Confluence REST API 的正确方法是啥?