C#winform怎么上传文件到服务器啊?

lala133 2014-04-01 03:13:49
        private void UpLoadFile(string fileNamePath, string uriString)
{
//string fileName = fileNamePath.Substring(fileNamePath.LastIndexOf("\\") + 1);
string NewFileName = DateTime.Now.ToString("yyMMddhhmmss") + DateTime.Now.Millisecond.ToString() + fileNamePath.Substring(fileNamePath.LastIndexOf("."));

string fileNameExt = fileNamePath.Substring(fileNamePath.LastIndexOf(".") + 1);
if (uriString.EndsWith("\\") == false) uriString = uriString + "\\";

uriString = uriString + NewFileName;
/**/
/// 创建WebClient实例
System.Net.WebClient myWebClient = new System.Net.WebClient();
// WebClient myWebClient = new WebClient();

//myWebClient.Credentials = CredentialCache.DefaultCredentials;

// 要上传的文件
FileStream fs = new FileStream(fileNamePath, FileMode.Open, FileAccess.Read);
//FileStream fs = OpenFile();
BinaryReader r = new BinaryReader(fs);
try
{
//使用UploadFile方法可以用下面的格式
//myWebClient.UploadFile(uriString,"PUT",fileNamePath);
byte[] postArray = r.ReadBytes((int)fs.Length);
Stream postStream = myWebClient.OpenWrite(uriString, "PUT");
if (postStream.CanWrite)
{
postStream.Write(postArray, 0, postArray.Length);
}
else
{
MessageBox.Show("文件目前不可写!");
}
postStream.Close();
}
catch(Exception ex)
{
MessageBox.Show(ex .ToString ()+"文件上传失败,请稍候重试~");
}
}




每次到 postStream.Close();这里距出错了,服务器,我设置权限为everyone了,还是不行,请问用什么方法上传文件呢?
...全文
3210 34 打赏 收藏 转发到动态 举报
写回复
用AI写文章
34 条回复
切换为时间正序
请发表友善的回复…
发表回复
编程有钱人了 2014-04-11
  • 打赏
  • 举报
回复
虽然结贴了,我想说了你用的是FTP协议,在服务器上也有FTP服务端的,是不是,客户端不能随意发的而没有接收端
lala133 2014-04-08
  • 打赏
  • 举报
回复
引用 30 楼 huainian23 的回复:
上传文件最蛋疼的莫过于程序没错,权限不够。
是啊,刚开始不知道,后面才知道。
lala133 2014-04-08
  • 打赏
  • 举报
回复


 //删除目录
        public void delDir(string dirName)
        {
            try
            {
                string uri = "ftp://" + ftpServerIP + "/" + dirName;
                Connect(uri);//连接      
                reqFTP.Method = WebRequestMethods.Ftp.RemoveDirectory;
                FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
                response.Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
        //获得文件大小
        public long GetFileSize(string filename)
        {
            long fileSize = 0;
            try
            {
                FileInfo fileInf = new FileInfo(filename);
                string uri = "ftp://" + ftpServerIP + "/" + fileInf.Name;
                Connect(uri);//连接      
                reqFTP.Method = WebRequestMethods.Ftp.GetFileSize;
                FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
                fileSize = response.ContentLength;
                response.Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            return fileSize;
        }
        //文件改名
        public void Rename(string currentFilename, string newFilename)
        {
            try
            {
                FileInfo fileInf = new FileInfo(currentFilename);
                string uri = "ftp://" + ftpServerIP + "/" + fileInf.Name;
                Connect(uri);//连接
                reqFTP.Method = WebRequestMethods.Ftp.Rename;
                reqFTP.RenameTo = newFilename;
                FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
                //Stream ftpStream = response.GetResponseStream();
                //ftpStream.Close();
                response.Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
        //获得文件明晰
        public string[] GetFilesDetailList()
        {
            return GetFileList("ftp://" + ftpServerIP + "/", WebRequestMethods.Ftp.ListDirectoryDetails);
        }
        //获得文件明晰
        public string[] GetFilesDetailList(string path)
        {
            return GetFileList("ftp://" + ftpServerIP + "/" + path, WebRequestMethods.Ftp.ListDirectoryDetails);
        }
    }
}
-----------------------
测试
       //获得文件列表
       private void button1_Click(object sender, EventArgs e)
        {
            FtpUpDown ftpUpDown = new FtpUpDown(ConvertData.Properties.Settings.Default.ftpServerIP, ConvertData.Properties.Settings.Default.ftpUserID, ConvertData.Properties.Settings.Default.ftpPassword);
            string[] str = ftpUpDown.GetFileList("2005");
            richTextBox1.Lines = str;
        }
        //下载
        private void button2_Click(object sender, EventArgs e)
        {
            FtpUpDown ftpUpDown = new FtpUpDown(ConvertData.Properties.Settings.Default.ftpServerIP, ConvertData.Properties.Settings.Default.ftpUserID, ConvertData.Properties.Settings.Default.ftpPassword);
            ftpUpDown.Download("c:\\", "2007/11/01/57070.pdf");
        }
        //上传
        private void button3_Click(object sender, EventArgs e)
        {
            FtpUpDown ftpUpDown = new FtpUpDown(ConvertData.Properties.Settings.Default.ftpServerIP, ConvertData.Properties.Settings.Default.ftpUserID, ConvertData.Properties.Settings.Default.ftpPassword);
            ftpUpDown.Upload("c:\\57070.pdf");
        }



希望这些代码能帮助像我一样在找解决方法的人。

lala133 2014-04-08
  • 打赏
  • 举报
回复


问题解决了,记得把ftp的权限设置好。

using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.IO;
using System.Windows.Forms;
namespace ConvertData
{
    class FtpUpDown
    {
        string ftpServerIP;
        string ftpUserID;
        string ftpPassword;
        FtpWebRequest reqFTP;
        private void Connect(String path)//连接ftp
        {
            // 根据uri创建FtpWebRequest对象
            reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(path));
            // 指定数据传输类型
            reqFTP.UseBinary = true;
            // ftp用户名和密码
            reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);
        }
        public FtpUpDown(string ftpServerIP, string ftpUserID, string ftpPassword)
        {
            this.ftpServerIP = ftpServerIP;
            this.ftpUserID = ftpUserID;
            this.ftpPassword = ftpPassword;
        }
        //都调用这个
        private string[] GetFileList(string path, string WRMethods)//上面的代码示例了如何从ftp服务器上获得文件列表
        {
            string[] downloadFiles;
            StringBuilder result = new StringBuilder();
            try
            {
                Connect(path);
                reqFTP.Method = WRMethods;
                WebResponse response = reqFTP.GetResponse();
                StreamReader reader = new StreamReader(response.GetResponseStream(), System.Text.Encoding.Default);//中文文件名
                string line = reader.ReadLine();
                while (line != null)
                {
                    result.Append(line);
                    result.Append("\n");
                    line = reader.ReadLine();
                }
                // to remove the trailing '\n'
                result.Remove(result.ToString().LastIndexOf('\n'), 1);
                reader.Close();
                response.Close();
                return result.ToString().Split('\n');
            }
            catch (Exception ex)
            {
                System.Windows.Forms.MessageBox.Show(ex.Message);
                downloadFiles = null;
                return downloadFiles;
            }
        }
        public string[] GetFileList(string path)//上面的代码示例了如何从ftp服务器上获得文件列表
        {
            return GetFileList("ftp://" + ftpServerIP + "/" + path, WebRequestMethods.Ftp.ListDirectory);
        }
        public string[] GetFileList()//上面的代码示例了如何从ftp服务器上获得文件列表
        {
            return GetFileList("ftp://" + ftpServerIP + "/", WebRequestMethods.Ftp.ListDirectory);
        }
        public void Upload(string filename) //上面的代码实现了从ftp服务器上载文件的功能
        {
            FileInfo fileInf = new FileInfo(filename);
            string uri = "ftp://" + ftpServerIP + "/" + fileInf.Name;
            Connect(uri);//连接         
            // 默认为true,连接不会被关闭
            // 在一个命令之后被执行
            reqFTP.KeepAlive = false;
            // 指定执行什么命令
            reqFTP.Method = WebRequestMethods.Ftp.UploadFile;
            // 上传文件时通知服务器文件的大小
            reqFTP.ContentLength = fileInf.Length;
            // 缓冲大小设置为kb 
            int buffLength = 2048;
            byte[] buff = new byte[buffLength];
            int contentLen;
            // 打开一个文件流(System.IO.FileStream) 去读上传的文件
            FileStream fs = fileInf.OpenRead();
            try
            {
                // 把上传的文件写入流
                Stream strm = reqFTP.GetRequestStream();
                // 每次读文件流的kb
                contentLen = fs.Read(buff, 0, buffLength);
                // 流内容没有结束
                while (contentLen != 0)
                {
                    // 把内容从file stream 写入upload stream 
                    strm.Write(buff, 0, contentLen);
                    contentLen = fs.Read(buff, 0, buffLength);
                }
                // 关闭两个流
                strm.Close();
                fs.Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Upload Error");
            }
        }
        public bool Download(string filePath, string fileName, out string errorinfo)////上面的代码实现了从ftp服务器下载文件的功能
        {
            try
            {
                String onlyFileName = Path.GetFileName(fileName);
                string newFileName = filePath + "\\" + onlyFileName;
                if (File.Exists(newFileName))
                {
                    errorinfo = string.Format("本地文件{0}已存在,无法下载", newFileName);
                    return false;
                }
                string url = "ftp://" + ftpServerIP + "/" + fileName;
                Connect(url);//连接 
                reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);
                FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
                Stream ftpStream = response.GetResponseStream();
                long cl = response.ContentLength;
                int bufferSize = 2048;
                int readCount;
                byte[] buffer = new byte[bufferSize];
                readCount = ftpStream.Read(buffer, 0, bufferSize);
                FileStream outputStream = new FileStream(newFileName, FileMode.Create);
                while (readCount > 0)
                {
                    outputStream.Write(buffer, 0, readCount);
                    readCount = ftpStream.Read(buffer, 0, bufferSize);
                }
                ftpStream.Close();
                outputStream.Close();
                response.Close();
                errorinfo = "";
                return true;
            }
            catch (Exception ex)
            {
                errorinfo = string.Format("因{0},无法下载", ex.Message);
                return false;
            }
        }
        //删除文件
        public void DeleteFileName(string fileName)
        {
            try
            {
                FileInfo fileInf = new FileInfo(fileName);
                string uri = "ftp://" + ftpServerIP + "/" + fileInf.Name;
                Connect(uri);//连接         
                // 默认为true,连接不会被关闭
                // 在一个命令之后被执行
                reqFTP.KeepAlive = false;
                // 指定执行什么命令
                reqFTP.Method = WebRequestMethods.Ftp.DeleteFile;
                FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
                response.Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "删除错误");
            }
        }
        //创建目录
        public void MakeDir(string dirName)
        {
            try
            {
                string uri = "ftp://" + ftpServerIP + "/" + dirName;
                Connect(uri);//连接      
                reqFTP.Method = WebRequestMethods.Ftp.MakeDirectory;
                FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
                response.Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }


_小黑_ 2014-04-02
  • 打赏
  • 举报
回复
删除 比较 麻烦 你需要 递归 先删除 最里面 的文件 之后 在 删除 文件夹 也就是 说 你不能 直接 删除 最外层的 文件夹 需要 冲内部 向 外部 删除
lala133 2014-04-02
  • 打赏
  • 举报
回复
引用 24 楼 Nick_0704 的回复:
这是之前我们在wince下边写的ftp上传方法
如果在ftp删除文件和创建文件夹?
lala133 2014-04-02
  • 打赏
  • 举报
回复

        private bool UploadFileByFtpWebRequest(string fileName, string ftpServerIP, string path, string userName, string password)
        {
            bool result = true;
            string url = string.Format("ftp://{0}/{1}/{3}", ftpServerIP,path , fileName.Substring(fileName.LastIndexOf(@"\") + 1));

            FtpWebRequest request = (FtpWebRequest)WebRequest.Create(url);
            request.Credentials = new NetworkCredential(userName, password);
            request.Method = WebRequestMethods.Ftp.UploadFile;

            Stream stream = request.GetRequestStream();
            FileStream fileStream = new FileStream(fileName, FileMode.Open);

            int packageSize = 1024 * 1024;
            int packageCount = (int)(fileStream.Length / packageSize);
            int rest = (int)(fileStream.Length % packageSize);
            this.BeginInvoke(new DoSomething(delegate()
            {
                this.pbarProcessUpload.Maximum = packageCount;
                if (rest != 0) this.pbarProcessUpload.Maximum += 1;
            }));

            for (int index = 0; index < packageCount; index++)
            {
                byte[] buffer = new byte[packageSize];
                fileStream.Read(buffer, 0, buffer.Length);

                stream.Write(buffer, 0, buffer.Length);

                this.BeginInvoke(new DoSomething(delegate()
                {
                    this.pbarProcessUpload.Value = index;
                }));
            }

            if (rest != 0)
            {
                byte[] buffer = new byte[rest];
                fileStream.Read(buffer, 0, buffer.Length);

                stream.Write(buffer, 0, buffer.Length);

                this.BeginInvoke(new DoSomething(delegate()
                {
                    this.pbarProcessUpload.Value += 1;
                }));
            }

            stream.Close();
            fileStream.Close();

            this.BeginInvoke(new DoSomething(delegate()
            {
                this.pbarProcessUpload.Value = 0;
            }));

            return result;
        }

        private delegate void DoSomething();
这个就可以上传到服务器了,我已经测试了,怎么通过FTP删除文件和创建文件夹啊?
Nick黄 2014-04-02
  • 打赏
  • 举报
回复
这是之前我们在wince下边写的ftp上传方法
Nick黄 2014-04-02
  • 打赏
  • 举报
回复
 #region login
        /**/
        /// <summary>
        /// Login to the remote server.
        /// </summary>
        public void login()
        {

            clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            IPEndPoint ep = new IPEndPoint(Dns.GetHostEntry(remoteHost).AddressList[0], remotePort);
            try
            {
                clientSocket.Connect(ep);
            }
            catch
            {
                //throw new IOException("Couldn't connect to remote server");;
            }

            readReply();
            if (retValue != 220)
            {
                Close();
                //throw new IOException(reply.Substring(4));
            }
            if (debug)
                Console.WriteLine("USER " + remoteUser);

            sendCommand("USER " + remoteUser);
            if (!(retValue == 331 || retValue == 230))
            {
                cleanup();
                //throw new IOException(reply.Substring(4));
            }

            if (retValue != 230)
            {
                if (debug)
                    Console.WriteLine("PASS xxx");

                sendCommand("PASS " + remotePass);
                if (!(retValue == 230 || retValue == 202))
                {
                    cleanup();
                    //throw new IOException(reply.Substring(4));
                }
            }
            logined = true;
            Console.WriteLine("Connected to " + remoteHost);
            ChDir(remotePath);
        }
        #endregion
Nick黄 2014-04-02
  • 打赏
  • 举报
回复
/**/
        /// <summary>
        /// Upload a file and set the resume flag.
        /// </summary>
        /// <param name="fileName"></param>
        /// <param name="resume"></param>
        /// <returns></returns>
        public bool Upload(string fileName, Boolean resume)
        {
            if (!logined)
            {
                login();
            }
            Socket cSocket = createDataSocket();
            long offset = 0;
            if (resume)
            {
                try
                {
                    setBinaryMode(true);
                    offset = getFileSize(fileName);

                }
                catch (Exception ex)
                {
                    offset = 0;
                }
            }

            if (offset > 0)
            {
                sendCommand("REST " + offset);
                if (retValue != 350)
                {
                    //throw new IOException(reply.Substring(4));
                    //Remote server may not support resuming.
                    offset = 0;
                }
            }

            sendCommand("STOR " + Path.GetFileName(fileName));

            if (!(retValue == 125 || retValue == 150))
            {
                throw new IOException(reply.Substring(4));
            }

            // open input stream to read source file
            FileStream input = new FileStream(fileName, FileMode.Open);
            if (offset != 0)
            {

                if (debug)
                {
                    Console.WriteLine("seeking to " + offset);
                }
                input.Seek(offset, SeekOrigin.Begin);
            }

            Console.WriteLine("Uploading file " + fileName + " to " + remotePath);

            while ((bytes = input.Read(buffer, 0, buffer.Length)) > 0)
            {
                cSocket.Send(buffer, bytes, 0);
            }
            input.Close();
            Console.WriteLine("");
            if (cSocket.Connected)
            {
                cSocket.Close();
            }
            readReply();
            if (!(retValue == 226 || retValue == 250))
            {
                throw new IOException(reply.Substring(4));
            }
            return true;
        }
给你段代码参考下吧
facelessvoidhj 2014-04-02
  • 打赏
  • 举报
回复
你可以现在自己机器上建一个FTP(好像要开启Window功能),先在本机上测试,google下C# ftp上传,有很多
lala133 2014-04-02
  • 打赏
  • 举报
回复
引用 19 楼 lala133 的回复:
[quote=引用 2 楼 l397870376 的回复:]

/// <summary> 
        /// 上传 
        /// </summary> 
        /// <param name="filename">要上传的本地文件名</param> 
        public void Upload(string filename)
        {
            FileInfo fileInf = new FileInfo(filename);
            string uri = ftpURI + fileInf.Name;
            FtpWebRequest reqFTP;

            reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri));
            reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);
            reqFTP.KeepAlive = false;
            reqFTP.Proxy = null;
            reqFTP.Method = WebRequestMethods.Ftp.UploadFile;
            reqFTP.UseBinary = true;
            reqFTP.ContentLength = fileInf.Length;
            int buffLength = 2048;
            byte[] buff = new byte[buffLength];
            int contentLen;
            FileStream fs = fileInf.OpenRead();
            try
            {
                Stream strm = reqFTP.GetRequestStream();
                contentLen = fs.Read(buff, 0, buffLength);
                while (contentLen != 0)
                {
                    strm.Write(buff, 0, contentLen);
                    contentLen = fs.Read(buff, 0, buffLength);
                }
                strm.Close();
                fs.Close();
            }
            catch (Exception ex)
            {
                Error_Log("FTP上传文件时发成错误,详细错误参数请查看错误日志。", "Upload Error --> " + ex.Message + "\r\n" + ex.StackTrace);
            }
        }
这是答案[/quote] 需要注意的是:设置好FTP的权限
lala133 2014-04-02
  • 打赏
  • 举报
回复
引用 2 楼 l397870376 的回复:

/// <summary> 
        /// 上传 
        /// </summary> 
        /// <param name="filename">要上传的本地文件名</param> 
        public void Upload(string filename)
        {
            FileInfo fileInf = new FileInfo(filename);
            string uri = ftpURI + fileInf.Name;
            FtpWebRequest reqFTP;

            reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri));
            reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);
            reqFTP.KeepAlive = false;
            reqFTP.Proxy = null;
            reqFTP.Method = WebRequestMethods.Ftp.UploadFile;
            reqFTP.UseBinary = true;
            reqFTP.ContentLength = fileInf.Length;
            int buffLength = 2048;
            byte[] buff = new byte[buffLength];
            int contentLen;
            FileStream fs = fileInf.OpenRead();
            try
            {
                Stream strm = reqFTP.GetRequestStream();
                contentLen = fs.Read(buff, 0, buffLength);
                while (contentLen != 0)
                {
                    strm.Write(buff, 0, contentLen);
                    contentLen = fs.Read(buff, 0, buffLength);
                }
                strm.Close();
                fs.Close();
            }
            catch (Exception ex)
            {
                Error_Log("FTP上传文件时发成错误,详细错误参数请查看错误日志。", "Upload Error --> " + ex.Message + "\r\n" + ex.StackTrace);
            }
        }
这是答案
编程有钱人了 2014-04-02
  • 打赏
  • 举报
回复
引用 15 楼 lala133 的回复:
[quote=引用 14 楼 wangjun8868 的回复:] 服务器上没网站 你怎么能用 System.Net.WebClient 来发送文件啊 用TCP或者FTP啊
局域网是可以发送文件成功的,服务器就不行。怎么用ftp啊?[/quote] 局域网的那台机器是不是建了一耳光共享文件夹吧,如果是的那不叫夸机器传送文件的 ,再说了,局域网和外网差别大了
Trust-Me 2014-04-02
  • 打赏
  • 举报
回复
上传文件最蛋疼的莫过于程序没错,权限不够。
u010482847 2014-04-02
  • 打赏
  • 举报
回复
我也是来学习的 求大神们各抒己见
lala133 2014-04-01
  • 打赏
  • 举报
回复
引用 14 楼 wangjun8868 的回复:
服务器上没网站 你怎么能用 System.Net.WebClient 来发送文件啊 用TCP或者FTP啊
局域网是可以发送文件成功的,服务器就不行。怎么用ftp啊?
编程有钱人了 2014-04-01
  • 打赏
  • 举报
回复
服务器上没网站 你怎么能用 System.Net.WebClient 来发送文件啊 用TCP或者FTP啊
加载更多回复(13)

110,539

社区成员

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

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

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