求大神帮忙看看代码,这个是在wince用HttpWebRequest上传文件,提示上传失败

cunnor 2013-10-16 02:53:08
菜鸟,刚接触,不懂,大神帮忙看看
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Net;
using System.Windows.Forms;

namespace frmBaQDemo
{
class uploadfile
{
public uploadfile()
{

}
/// <summary>
/// 将本地文件上传到指定的服务器(HttpWebRequest方法)
/// </summary>
/// <param name="address">文件上传到的服务器</param>
/// <param name="fileNamePath">要上传的本地文件(全路径)</param>
/// <param name="saveName">文件上传后的名称</param>
/// <returns>成功返回1,失败返回0</returns>
public int Upload_Request(string address, string fileNamePath, string saveName)
{
int returnValue = 0;
// 要上传的文件
FileStream fs = new FileStream(fileNamePath, FileMode.Open, FileAccess.Read);
BinaryReader r = new BinaryReader(fs);
//时间戳
string strBoundary = "----------" + DateTime.Now.Ticks.ToString("x");
byte[] boundaryBytes = Encoding.ASCII.GetBytes("\r\n--" + strBoundary + "\r\n");
//请求头部信息
StringBuilder sb = new StringBuilder();
sb.Append("--");
sb.Append(strBoundary);
sb.Append("\r\n");
sb.Append("Content-Disposition: form-data; name=\"");
sb.Append("file");
sb.Append("\"; filename=\"");
sb.Append(saveName);
sb.Append("\"");
sb.Append("\r\n");
sb.Append("Content-Type: ");
sb.Append("application/octet-stream");
sb.Append("\r\n");
sb.Append("\r\n");
string strPostHeader = sb.ToString();
byte[] postHeaderBytes = Encoding.UTF8.GetBytes(strPostHeader);
// 根据uri创建HttpWebRequest对象
HttpWebRequest httpReq = (HttpWebRequest)WebRequest.Create(new Uri(address));
httpReq.Method = "POST";
//对发送的数据不使用缓存
httpReq.AllowWriteStreamBuffering = false;
//设置获得响应的超时时间(300秒)
httpReq.Timeout = 300000;
httpReq.ContentType = "multipart/form-data; boundary=" + strBoundary;
long length = fs.Length + postHeaderBytes.Length + boundaryBytes.Length;
long fileLength = fs.Length;
httpReq.ContentLength = length;
try
{
//每次上传4k
int bufferLength = 4096;
byte[] buffer = new byte[bufferLength];
//已上传的字节数
long offset = 0;
//开始上传时间
DateTime startTime = DateTime.Now;
int size = r.Read(buffer, 0, bufferLength);
Stream postStream = httpReq.GetRequestStream();
//发送请求头部消息
postStream.Write(postHeaderBytes, 0, postHeaderBytes.Length);
while (size > 0)
{
postStream.Write(buffer, 0, size);
offset += size;
Application.DoEvents();
size = r.Read(buffer, 0, bufferLength);
}
//添加尾部的时间戳
postStream.Write(boundaryBytes, 0, boundaryBytes.Length);
postStream.Close();
//获取服务器端的响应
WebResponse webRespon = httpReq.GetResponse();
Stream s = webRespon.GetResponseStream();
StreamReader sr = new StreamReader(s);
//读取服务器端返回的消息
String sReturnString = sr.ReadLine();
s.Close();
sr.Close();
if (sReturnString == "Success")
{
returnValue = 1;
}
else if (sReturnString == "Error")
{
returnValue = 0;
}
}
catch
{
returnValue = 0;
}
finally
{
fs.Close();
r.Close();
}
return returnValue;
}

}
}
...全文
426 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
tang12345tang 2014-08-02
  • 打赏
  • 举报
回复
你在你的服务器收到上传的内容后,再发送一个Success字符串回来就可以了
tang12345tang 2014-08-02
  • 打赏
  • 举报
回复
我测试过这上传程序,没有问题,可以上传成功的,你应该看你的服务器是否接收到 我的测试环境是 用采集器WINCE 服务器为XP 程序是用DELPHI写的接收程序 在内网测试传送2M的文件要20秒左右
feiyun0112 2013-10-18
  • 打赏
  • 举报
回复
@"\\192.168.134.64:8086\images" 你先确定路径是可以访问的
cunnor 2013-10-18
  • 打赏
  • 举报
回复
引用 11 楼 feiyun0112 的回复:
@"\\192.168.134.64:8086\images\1.jpg"
还是不对,我试了一下,还是@"\\192.168.134.64:8086\images\1.jpg" 这个问题说格式不正确
feiyun0112 2013-10-18
  • 打赏
  • 举报
回复
@"\\192.168.134.64:8086\images\1.jpg"
feiyun0112 2013-10-17
  • 打赏
  • 举报
回复
//读取服务器端返回的消息
String sReturnString = sr.ReadLine();
s.Close();
sr.Close();
if (sReturnString == "Success")

代码中的页面上传完会返回Success字符串,你的页面返回什么,改成相应判断

*****************************************************************************
签名档: http://feiyun0112.cnblogs.com/
cunnor 2013-10-17
  • 打赏
  • 举报
回复
引用 2 楼 wawd74520 的回复:
你这里上传是网上copy的方法么?
是的,网上找的,对这个不太懂
cunnor 2013-10-17
  • 打赏
  • 举报
回复
引用 9 楼 feiyun0112 的回复:
wince上可以访问那个服务器路径吗,如果能直接copy过去 就用File.Copy 方法 http://msdn.microsoft.com/zh-cn/library/c6cfw35a%28v=vs.80%29.aspx
File.Copy(saveFileName, @"192.168.134.64:8086\\images\\1.jpg"); saveFileName是要上传的文件,但这个提示是 不支持给定路径格式,你帮忙看看的啊
feiyun0112 2013-10-17
  • 打赏
  • 举报
回复
wince上可以访问那个服务器路径吗,如果能直接copy过去 就用File.Copy 方法 http://msdn.microsoft.com/zh-cn/library/c6cfw35a%28v=vs.80%29.aspx
cunnor 2013-10-17
  • 打赏
  • 举报
回复
引用 7 楼 feiyun0112 的回复:
你是要上传到哪?不是网站上吗?
不是的,是用wince开发的程序,是把电子签名保存为图片,上传到指定的服务器路径下面,不是网页上上传图片的,我这是菜鸟,不懂这些,我估计是搜错了……大神,能给提供点思路的么
feiyun0112 2013-10-17
  • 打赏
  • 举报
回复
你是要上传到哪?不是网站上吗?
cunnor 2013-10-17
  • 打赏
  • 举报
回复
引用 5 楼 wawd74520 的回复:
第一 尾部 byte[] boundaryBytes = Encoding.ASCII.GetBytes("\r\n--" + strBoundary + "\r\n"); 一般是---------xxxxxxxxxxxxxx-- 后面多两个减 第二 服务器接收模式你不清楚 是多个交互形式的post过去 还是一次弄过去 这个你得抓包分析 第三 提交的数据是不是对应上
请问HttpWebRequest需要服务端的么,还是像webclient直接上传到服务器的文件夹里面,我是想把图片上传到指定服务器的对应的路径下的,网上搜的很多关于HttpWebRequest是说网页的什么的,不太懂,还有你能讲讲HttpWebRequest传输文件的原理是啥,怎样进行交互的,谢谢
失落的神庙 2013-10-17
  • 打赏
  • 举报
回复
第一 尾部 byte[] boundaryBytes = Encoding.ASCII.GetBytes("\r\n--" + strBoundary + "\r\n"); 一般是---------xxxxxxxxxxxxxx-- 后面多两个减 第二 服务器接收模式你不清楚 是多个交互形式的post过去 还是一次弄过去 这个你得抓包分析 第三 提交的数据是不是对应上
失落的神庙 2013-10-16
  • 打赏
  • 举报
回复
你这里上传是网上copy的方法么?
cunnor 2013-10-16
  • 打赏
  • 举报
回复
有大神么,帮忙看看的啊

110,545

社区成员

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

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

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