通过上一篇博客《C# 之 FTP服务器中文件上传与下载(一)》,我们已经创建好了一个FTP服务器,并且该服务器需要用户名和密码的验证。今天我们来实现文件的上传。
首先,我们前台需要一个FileUpload控件和一个Button控件
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:FileUpload ID="fuImage" runat="server" Width="400px" />
<asp:Button runat="server" ID="btnUpLoad" Text="上传" CssClass="nButton" OnClick="btnUpLoad_Click" />
</div>
</form>
</body>
</html>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void btnUpLoad_Click(object sender, EventArgs e)
{
string strFtpPath = "FTP://192.168.1.100:21"; //ftp地址
string strUserName = "hehe"; //用户名
string strPassword = "123456"; //密码
Boolean flag = false;
string strFullName = "";
if (fuImage.PostedFile.FileName != "")
{
strFullName = fuImage.PostedFile.FileName; //所选择文件的路径
}
else
{
Response.Write("<script>alert('请选择要上传的文件!');</script>");
}
//上传文件
System.IO.FileInfo fileInfo = new System.IO.FileInfo(fuImage.PostedFile.FileName);
flag=UploadFile(fileInfo, strFtpPath, strUserName, strPassword);
if (flag==true)
{
Response.Write("<script>alert('文件上传成功!');</script>");
}
else
{
Response.Write("<script>alert('文件上传失败!');</script>");
}
}
/// <summary>
/// 上传文件
/// </summary>
/// <param name="fileinfo">需要上传的文件</param>
/// <param name="targetDir">目标路径</param>
/// <param name="hostname">ftp地址</param>
/// <param name="username">ftp用户名</param>
/// <param name="password">ftp密码</param>
/// <returns></returns>
public static Boolean UploadFile(System.IO.FileInfo fileinfo, string hostname, string username, string password)
{
string strExtension = System.IO.Path.GetExtension(fileinfo.FullName);
string strFileName="";
strFileName = fileinfo.Name; //获取文件的文件名
string URI = hostname + "/" + strFileName;
//获取ftp对象
System.Net.FtpWebRequest ftp = GetRequest(URI, username, password);
//设置ftp方法为上传
ftp.Method = System.Net.WebRequestMethods.Ftp.UploadFile;
//制定文件传输的数据类型
ftp.UseBinary = true;
ftp.UsePassive = true;
//文件大小
ftp.ContentLength = fileinfo.Length;
//缓冲大小设置为2kb
const int BufferSize = 2048;
byte[] content = new byte[BufferSize - 1 + 1];
int dataRead;
//打开一个文件流(System.IO.FileStream)去读上传的文件
using (System.IO.FileStream fs = fileinfo.OpenRead())
{
try
{
//把上传的文件写入流
using (System.IO.Stream rs = ftp.GetRequestStream())
{
do
{
//每次读文件流的2KB
dataRead = fs.Read(content, 0, BufferSize);
rs.Write(content, 0, dataRead);
} while (!(dataRead < BufferSize));
rs.Close();
return true;
}
}
catch (Exception ex)
{
ftp = null;
ftp = GetRequest(URI, username, password);
ftp.Method = System.Net.WebRequestMethods.Ftp.DeleteFile;//删除
ftp.GetResponse();
return false;
}
finally
{
fs.Close();
}
}
}
/// <summary>
/// 得到ftp对象
/// </summary>
/// <param name="URI">ftp地址</param>
/// <param name="username">ftp用户名</param>
/// <param name="password">ftp密码</param>
/// <returns>返回ftp对象</returns>
private static System.Net.FtpWebRequest GetRequest(string URI, string username, string password)
{
//根据服务器信息FtpWebRequest创建类的对象
FtpWebRequest result = (FtpWebRequest)FtpWebRequest.Create(URI);
//提供身份验证信息
result.Credentials = new System.Net.NetworkCredential(username, password);
//result.Credentials = new System.Net.NetworkCredential();
//设置请求完成之后是否保持到FTP服务器的控制连接,默认值为true
result.KeepAlive = false;
return result;
}
}
最后看看我们运行的效果吧
点击浏览,选择我们需要上传的文件
点击上传,上传我们选择的文件
最后我们看看我们的ftp服务器中该文件是否已经上传
文件上传就这样上传成功了,我这里的上传可以上传我们所有的文件,当然我们也可以前台通过JS来控制我们只能上传什么样的格式,这个就让大家自己去寻找一下答案吧。