当前位置:编程学习 > C#/ASP.NET >>

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

菜鸟,刚接触,不懂,大神帮忙看看
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;
        }

    }
}
--------------------编程问答-------------------- 有大神么,帮忙看看的啊 --------------------编程问答-------------------- 你这里上传是网上copy的方法么? --------------------编程问答--------------------
引用 2 楼 wawd74520 的回复:
你这里上传是网上copy的方法么?

是的,网上找的,对这个不太懂 --------------------编程问答--------------------  //读取服务器端返回的消息
                 String sReturnString = sr.ReadLine();
                 s.Close();
                 sr.Close();
                 if (sReturnString == "Success")

代码中的页面上传完会返回Success字符串,你的页面返回什么,改成相应判断
  
*****************************************************************************
签名档: http://feiyun0112.cnblogs.com/ --------------------编程问答-------------------- 第一

尾部
byte[] boundaryBytes = Encoding.ASCII.GetBytes("\r\n--" + strBoundary + "\r\n");

一般是---------xxxxxxxxxxxxxx--  后面多两个减

第二

服务器接收模式你不清楚
是多个交互形式的post过去
还是一次弄过去
这个你得抓包分析

第三
提交的数据是不是对应上

--------------------编程问答--------------------
引用 5 楼 wawd74520 的回复:
第一

尾部
byte[] boundaryBytes = Encoding.ASCII.GetBytes("\r\n--" + strBoundary + "\r\n");

一般是---------xxxxxxxxxxxxxx--  后面多两个减

第二

服务器接收模式你不清楚
是多个交互形式的post过去
还是一次弄过去
这个你得抓包分析

第三
提交的数据是不是对应上

请问HttpWebRequest需要服务端的么,还是像webclient直接上传到服务器的文件夹里面,我是想把图片上传到指定服务器的对应的路径下的,网上搜的很多关于HttpWebRequest是说网页的什么的,不太懂,还有你能讲讲HttpWebRequest传输文件的原理是啥,怎样进行交互的,谢谢 --------------------编程问答-------------------- 你是要上传到哪?不是网站上吗? --------------------编程问答--------------------
引用 7 楼 feiyun0112 的回复:
你是要上传到哪?不是网站上吗?

不是的,是用wince开发的程序,是把电子签名保存为图片,上传到指定的服务器路径下面,不是网页上上传图片的,我这是菜鸟,不懂这些,我估计是搜错了……大神,能给提供点思路的么 --------------------编程问答-------------------- wince上可以访问那个服务器路径吗,如果能直接copy过去
就用File.Copy 方法 
http://msdn.microsoft.com/zh-cn/library/c6cfw35a%28v=vs.80%29.aspx --------------------编程问答--------------------
引用 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是要上传的文件,但这个提示是 不支持给定路径格式,你帮忙看看的啊
--------------------编程问答-------------------- @"\\192.168.134.64:8086\images\1.jpg" --------------------编程问答--------------------
引用 11 楼 feiyun0112 的回复:
@"\\192.168.134.64:8086\images\1.jpg"

还是不对,我试了一下,还是@"\\192.168.134.64:8086\images\1.jpg" 这个问题说格式不正确 --------------------编程问答-------------------- @"\\192.168.134.64:8086\images" 

你先确定路径是可以访问的
补充:.NET技术 ,  C#
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,