如何在服务器端解析http上传文件包

cqhydz 2018-01-18 08:24:45
服务器端:
//接收并读取POST过来的文件流
Stream str = Request.InputStream;
// String xmlData = reader.ReadToEnd();
//把数据重新返回给客户端
//Response.Write(xmlData);
using (FileStream fileStream = new FileStream(urlstr, FileMode.Create, FileAccess.Write))
{
int size = 2048;
byte[] data = new byte[2048];
while (true)
{
size = str.Read(data, 0, data.Length);
if (size > 0)
{
fileStream.Write(data, 0, size);
}
else
{
break;
}
}
}

客户端:
<form id="form1" method="post" enctype="multipart/form-data" action="/up1.aspx?sub=upfile&filename=cre3.png">
<input id="File1" type="file" name="File1"/>
<input id="Submit1" type="submit" value="submit" />
</form>


----正常文件-----------

塒NG



p橂T
--------

///////////////////////////-接收后保存文件//////////////////////
-----------------------------70912165624427

Content-Disposition: form-data; name="File1"; filename="璧勬簮鍏变韩.png"

Content-Type: image/png



塒NG

IEND瓸`?
-----------------------------70912165624427--
...全文
1350 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
cqhydz 2018-02-05
  • 打赏
  • 举报
回复
再加+50分,哪位看一下,谢谢
cqhydz 2018-02-01
  • 打赏
  • 举报
回复
https://pan.baidu.com/s/1c3QQJIC
字符串太多了,上传到云盘中去了,现在就这个数据。
cqhydz 2018-02-01
  • 打赏
  • 举报
回复
引用 20 楼 xuzuning 的回复:
由于让你给出你收到的数据,你没有给,只能用你 #1 示例的数据做演示了
        static void Main(string[] args)
{
var s = @"Content-Type: multipart/form-data; boundary=---------------------------208301002832498
Content-Length: 10542

---------------------------208301002832498
Content-Disposition: form-data; name=""upLoad""; filename=""cre3.png""
Content-Type: image/png

‰PNG
。。。。。。。。。。。。。。。。。。。
---------------------------208301002832498--";
var b = Encoding.Default.GetBytes(s) //你实际接收到的就是 byte[],所以并不需要做字符串转字节数组

var mask = "";
var flag = false;
var result = new List<string>();
using (var ms = new MemoryStream(b))
{
var sr = new StreamReader(ms);
while (!sr.EndOfStream)
{
var r = sr.ReadLine();
if (mask == "")
{
var n = r.IndexOf("boundary=", 0);
if (n > 0) mask = r.Substring(n + "boundary=".Length);
}
else
{
if (r.Contains(mask))
{
flag = !flag;
continue;
}
}
if (flag)
{
if (r.Contains("Content-Disposition:"))
{
//解析出文件名
continue;
}
if (r.Contains("Content-Type:"))
{
//解析出文件类型
continue;
}
if (r == "") continue; //跳过空行
result.Add(r);
}
}
}
Console.WriteLine(string.Join("\r\n", result)); //由于是按行读,所以要补上可能丢失的回车换行符
}
搞了一天还是没搞定,我将数据传上来吧。
接收文件数据
byte[] b = Request.BinaryRead(Request.TotalBytes);
string str = System.Text.Encoding.Default.GetString(b);
str = Server.UrlEncode(str).Replace("+", "%20");
Response.Write(str);
Response.End();

cqhydz 2018-01-27
  • 打赏
  • 举报
回复
引用 15 楼 xuzuning 的回复:
把你收到的数据流转成 base64 字符串贴出来
找了一晚上这里的问题,就是同我问题一样,但它将关键部分没写,Regex rginput =new Regex("略"); footLength http://www.cnblogs.com/chy710/archive/2010/02/25/1673724.html
xuzuning 2018-01-27
  • 打赏
  • 举报
回复
由于让你给出你收到的数据,你没有给,只能用你 #1 示例的数据做演示了
        static void Main(string[] args)
{
var s = @"Content-Type: multipart/form-data; boundary=---------------------------208301002832498
Content-Length: 10542

---------------------------208301002832498
Content-Disposition: form-data; name=""upLoad""; filename=""cre3.png""
Content-Type: image/png

‰PNG
。。。。。。。。。。。。。。。。。。。
---------------------------208301002832498--";
var b = Encoding.Default.GetBytes(s) //你实际接收到的就是 byte[],所以并不需要做字符串转字节数组

var mask = "";
var flag = false;
var result = new List<string>();
using (var ms = new MemoryStream(b))
{
var sr = new StreamReader(ms);
while (!sr.EndOfStream)
{
var r = sr.ReadLine();
if (mask == "")
{
var n = r.IndexOf("boundary=", 0);
if (n > 0) mask = r.Substring(n + "boundary=".Length);
}
else
{
if (r.Contains(mask))
{
flag = !flag;
continue;
}
}
if (flag)
{
if (r.Contains("Content-Disposition:"))
{
//解析出文件名
continue;
}
if (r.Contains("Content-Type:"))
{
//解析出文件类型
continue;
}
if (r == "") continue; //跳过空行
result.Add(r);
}
}
}
Console.WriteLine(string.Join("\r\n", result)); //由于是按行读,所以要补上可能丢失的回车换行符
}
cqhydz 2018-01-27
  • 打赏
  • 举报
回复
引用 14 楼 starfd 的回复:
http://blog.csdn.net/starfd/article/details/53308651 上面是webapi的,允许换成webpai吗?对应android
谢谢我先研究一下这个
xuzuning 2018-01-24
  • 打赏
  • 举报
回复
把你收到的数据流转成 base64 字符串贴出来
  • 打赏
  • 举报
回复
http://blog.csdn.net/starfd/article/details/53308651 上面是webapi的,允许换成webpai吗?对应android
cqhydz 2018-01-24
  • 打赏
  • 举报
回复
引用 11 楼 Roselle_2013 的回复:
引用 9 楼 cqhydz 的回复:
[quote=引用 8 楼 Roselle_2013 的回复:] 请问你的Request对象是System.Web.HttpRequest类型的对象吗?如果是的话应该有一个Request.Files的属性可以获取上传的文件。
因为这是其它系统传过来的数据,相当于是直接发过来的。
不管是哪种,文件要是通过前端Form标签传过来的就可以用Request.Files获取啊[/quote] 安桌发过来的数据,根据就没有你想的什么Request.Files的属性之类的东西,就是上文中提到的数据内容。下面这种开头的数据流。 Content-Disposition: form-data; name="File1"; filename="璧勬簮鍏变韩.png" Content-Type: image/png
cqhydz 2018-01-24
  • 打赏
  • 举报
回复
引用 10 楼 starfd 的回复:
你的服务端是哪种,webform?mvc?还是webapi?
webform
Roselle_2013 2018-01-24
  • 打赏
  • 举报
回复
引用 9 楼 cqhydz 的回复:
引用 8 楼 Roselle_2013 的回复:
请问你的Request对象是System.Web.HttpRequest类型的对象吗?如果是的话应该有一个Request.Files的属性可以获取上传的文件。
因为这是其它系统传过来的数据,相当于是直接发过来的。
不管是哪种,文件要是通过前端Form标签传过来的就可以用Request.Files获取啊
  • 打赏
  • 举报
回复
你的服务端是哪种,webform?mvc?还是webapi?
wanghui0380 2018-01-24
  • 打赏
  • 举报
回复
问题的关键是,你到底用在哪里? asp.net 天生就可以,webfrom天生就可以,webapi天生就可以,owin天生就可以 ps:实际上这个不用自己解析,上面说的所有东西都使用了system.net.http 和http监听类,而这些东西本身就在http监听类里面天生就实现了
Roselle_2013 2018-01-24
  • 打赏
  • 举报
回复

using (var stream = Request.Files[0].InputStream)
 {
                MemoryStream ms = new MemoryStream();
                stream.CopyTo(ms);
                Bitmap bit = new Bitmap(ms);
                bit.Save(context.Request.PhysicalApplicationPath + "\\1.jpg", System.Drawing.Imaging.ImageFormat.Jpeg);
                bit.Dispose();
}
不知道为什么你不行,ASP.net下应该都可以这样才对啊。
Roselle_2013 2018-01-23
  • 打赏
  • 举报
回复
请问你的Request对象是System.Web.HttpRequest类型的对象吗?如果是的话应该有一个Request.Files的属性可以获取上传的文件。
cqhydz 2018-01-23
  • 打赏
  • 举报
回复
引用 8 楼 Roselle_2013 的回复:
请问你的Request对象是System.Web.HttpRequest类型的对象吗?如果是的话应该有一个Request.Files的属性可以获取上传的文件。
因为这是其它系统传过来的数据,相当于是直接发过来的。
cqhydz 2018-01-22
  • 打赏
  • 举报
回复
引用 5 楼 xuzuning 的回复:
C# 不知道有没有,asp 的到处都是
能发一下代码或,相关内容一个链接吗,或者什么关键字百度。
xuzuning 2018-01-20
  • 打赏
  • 举报
回复
C# 不知道有没有,asp 的到处都是
cqhydz 2018-01-20
  • 打赏
  • 举报
回复
引用 3 楼 xuzuning 的回复:
你只是没有把头尾去掉 读取时先从 Content-Type: multipart/form-data; boundary=..... 行中解析出 #FF0000].....[/color],这是数据块的分隔符,数据在两个分隔符之间,可能有多段 Content-Disposition: form-data; name="upLoad"; filename="cre3.png"<回车><换行> Content-Type: image/png<回车><换行> <回车><换行> 是文件名和类型说明,读取后不保留
主要是有什么成熟代码处理吗,我发贴前就试着手动修改了一下,取消上面段与下面段发现生成文件还是不能正常,谢谢
加载更多回复(2)

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧