Asp.Net_上传文件(ftp、webClient、webService)
第一种:通过FTP来上传文件
首先,在另外一台服务器上设置好FTP服务,并创建好允许上传的用户和密码,然后,在ASP.NET里就可以直接将文件上传到这台 FTP 服务器上了。代码如下:
<%@ Page Language="C#" EnableViewState="false"%> <%@ Import Namespace="System.Net" %>
<%@ Import Namespace="System.IO" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
protected void Button1_Click(object sender, EventArgs e)
{
//要接收文件的 ftp 服务器地址
String serverUri = "ftp://192.168.3.1/";
String fileName = Path.GetFileName(FileUpload1.FileName);
serverUri += fileName; FtpWebRequest request = (FtpWebRequest)WebRequest.Create(serverUri);
request.Method = WebRequestMethods.Ftp.AppendFile;
request.UseBinary = true;
request.UsePassive = true; // ftp 服务器上允许上传的用户名和密码
request.Credentials = new NetworkCredential("upload", "upload");
Stream requestStream = request.GetRequestStream();
Byte[] buffer = FileUpload1.FileBytes; requestStream.Write(buffer, , buffer.Length);
requestStream.Close();
FtpWebResponse response = (FtpWebResponse)request.GetResponse();
Label1.Text = response.StatusDescription;
response.Close();
}
</script>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>将文件上传到另外一个服务器的方法二</title>
</head>
<body>
<form id="form1" runat="server">
<asp:FileUpload ID="FileUpload1" runat="server" />
<asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="上传文件" />
<div><asp:Label ID="Label1" runat="server" Text=""></asp:Label></div>
</form>
</body>
</html>
Code
第二种:通过WebClient来上传文件
如:现在的开发的web应用程序的虚拟目录是WebAA,另一个应用程序的虚拟目录是WebBB,现在要从WebAA向WebBB下的一个UpLoadFiles文件夹下保存图片
1.在WebBB项目下添加一个UploadHandler.ashx文件,代码如下:
public class UploadHandler : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
string filename = context.Request.QueryString["filename"].ToString();
using (FileStream inputStram = File.Create(context.Server.MapPath("UpLoadFiles/") + filename))
{
SaveFile(context.Request.InputStream, inputStram);
} }
protected void SaveFile(Stream stream, FileStream inputStream)
{
int bufSize=;
int byteGet=;
byte[] buf=new byte[bufSize];
while ((byteGet = stream.Read(buf, , bufSize)) > )
{
inputStream.Write(buf, , byteGet);
}
}
public bool IsReusable
{
get
{
return false;
}
}
}
Code
2.在WebAA项目中通过WebClient或者WebRequest请求该url,下面以WebClient为例说明。 在WebAA中新建test.aspx页面,上面有FileUpload控件FileUpload1和Button控件Button1,具体事件代码如下:
using System.IO;
using System.Net; MemoryStream ms;
protected void wc_OpenWriteCompleted(object sender, OpenWriteCompletedEventArgs e)
{
int bufSize = ;
int byteGet = ;
byte[] buf = new byte[bufSize];
while ((byteGet = ms.Read(buf, , bufSize)) > )//循环读取,上传
{
e.Result.Write(buf, , byteGet);//注意这里
}
e.Result.Close();//关闭
ms.Close();关闭ms
}
protected void Button1_Click(object sender, EventArgs e)
{
FileUpload fi = FileUpload1; byte[] bt = fi.FileBytes;//获取文件的Byte[]
ms = new MemoryStream(bt);//用Byte[],实例化ms UriBuilder url = new UriBuilder("http://xxxxxxxx/WebBB/UploadHandler.ashx");//上传路径
url.Query = string.Format("filename={0}", Path.GetFileName(fi.FileName));//上传url参数
WebClient wc = new WebClient();
wc.OpenWriteCompleted += new OpenWriteCompletedEventHandler(wc_OpenWriteCompleted);//委托异步上传事件
wc.OpenWriteAsync(url.Uri);//开始异步上传
}
Code
第三种:通过Web Service来上传文件(与第二种其实原理有些相同)
1.首先定义Web Service类,代码如下:
using System;
using System.Data;
using System.Web;
using System.Collections;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.ComponentModel;
using System.IO; namespace UpDownFile
{
/**/
/// <summary>
/// UpDownFile 的摘要说明
/// </summary>
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[ToolboxItem(false)]
public class UpDownFile : System.Web.Services.WebService
{
//上传文件至WebService所在服务器的方法,这里为了操作方法,文件都保存在UpDownFile服务所在文件夹下的File目录中
[WebMethod]
public bool Up(byte[] data, string filename)
{
try
{
FileStream fs = File.Create(Server.MapPath("File/") + filename);
fs.Write(data, , data.Length);
fs.Close();
return true;
}
catch
{
return false;
}
} //下载WebService所在服务器上的文件的方法
[WebMethod]
public byte[] Down(string filename)
{
string filepath = Server.MapPath("File/") + filename;
if (File.Exists(filepath))
{
try
{
FileStream s = File.OpenRead(filepath);
return ConvertStreamToByteBuffer(s);
}
catch
{
return new byte[];
}
}
else
{
return new byte[];
}
}
}
}
Code
2.在网站中引用上述创建的WEB服务,命名为(UpDownFile,可自行定义),然后在页面DownFile.aspx中分别实现文件上传与下载:
上传:
//FileUpload1是aspx页面的一个FileUpload控件
UpDownFile.UpDownFile up = new UpDownFile.UpDownFile();
up.Up(ConvertStreamToByteBuffer(FileUpload1.PostedFile.InputStream),
FileUpload1.PostedFile.FileName.Substring(FileUpload1.PostedFile.FileName.LastIndexOf("\\") + ));
下载:
UpDownFile.UpDownFile down = new UpDownFile.UpDownFile();
byte[] file = down.Down(Request.QueryString["filename"].ToString()); //filename是要下载的文件路径,可自行以其它方式获取文件路径
Response.BinaryWrite(file);
以下是将文件流转换成文件字节的函数(因为Stream类型的是不能直接通过WebService传输):
protected byte[] ConvertStreamToByteBuffer(Stream s)
{
BinaryReader br = new BinaryReader(stream);
byte[] fileBytes = br.ReadBytes((int)stream.Length);
return fileBytes;
}
Code
第四种:通过页面跳转或嵌套页面的方式(这种方法很简单,严格不算跨服务器,且有一定的局限性)
实现方法:
1.在需要上传文件的页面加入iframe,iframe的地址指向另一个服务器上传页面,并且页面需包含上传按钮;
2.需要上传时就利用JS的location.href或服务端的Response.redirect跳转至另一个服务器上传页面;
Asp.Net_上传文件(ftp、webClient、webService)的更多相关文章
- ASP.NET实现二维码 ASP.Net上传文件 SQL基础语法 C# 动态创建数据库三(MySQL) Net Core 实现谷歌翻译ApI 免费版 C#发布和调试WebService ajax调用WebService实现数据库操作 C# 实体类转json数据过滤掉字段为null的字段
ASP.NET实现二维码 using System;using System.Collections.Generic;using System.Drawing;using System.Linq;us ...
- ASP.NET上传文件,已经上传的大小保存在session中,在另一个页面中读取session的值不行
想自己做个ASP.NET上传文件时显示进度条的, 按照自己的想法,其实也就是显示每次已经上传的字节,从网上找到一个方法是能够把文件变成流以后再慢慢写入的,我在那个循环写入的时候每循环一次都把已经上传的 ...
- Asp.net上传文件后台通过二进制流发送到其他Url保存
实际情况一般有单独的站点存放静态文件,比如图片.office文档等.A站点的操作需要上传文件到B站点, 下面介绍一种方法通过System.Net.WebClient类的UploadData方法 . u ...
- asp.net 上传文件
文件上传实例 公司产品中一直是采用 flash 实现文件上传功能,但用户的需求多了以后遇到了越来越多难以解决的问题,最后试着用硕正提供的freeform.小型页面控件来解决. 硕正文件上传的实现途径有 ...
- asp.net 上传文件超过了最大请求长度
今天系统遇到了一个问题,上传4m以上的文件,uploadify就会报错:超过了最大请求长度. 开始我以为是设置的大小,可是后来我看了uploadify的fileSizeLimit=1024*10,也就 ...
- asp.net上传文件超过了最大请求长度[转]
错误消息:超过了最大请求长度 错误原因:asp.net默认最大上传文件大小为4M,运行超时时间为90S. 解决方案 1. 修改web.config文件可以改变这个默认值 ...
- Asp.net上传文件Request.files获取不到文件
使用ftp上传文件,并且Request.files获取文件,今天发现获取到的文件个数始终是0个,查了下原来form标签中需加入enctype=”multipart/form-data”,呵呵了 < ...
- ASP.NET上传文件的三种基本方法
ASP.NET依托.net framework类库,封装了大量的功能,使得上传文件非常简单,主要有以下三种基本方法. 方法一:用Web控件FileUpload,上传到网站根目录. Test.aspx关 ...
- ASP.NET上传文件的几种方法
//上传文件实例 if (fileDealer.HasFile)//判断文件是否存在 { string filepath = ""; ...
随机推荐
- 无法获取链接服务器 "XXX" 的 OLE DB 访问接口 "SQLNCLI10" 的架构行集 "DBSCHEMA_TABLES_INFO"。该访问接口支持该接口,但使用该接口时返回了失败代码。
1. SQL 2000 下载补丁 SQL2KSP4 ,进行安装 2.找到SQL2KSP4\install\instcat.sql 并在sql2000 中打开查询分析器中执行
- guider – 全系统Linux性能分析器
Guider是一个免费且开源的,功能强大的全系统性能分析工具,主要以Python for Linux 操作系统编写. 它旨在衡量系统资源使用量并跟踪系统行为,从而使其可以有效分析系统性能问题或进行性能 ...
- Android 的提权(root)原理【转】
Android的内核就是Linux,所以Android获取root其实和Linux获取root权限是一回事儿. su还需要所有者(Owner)是root才能正确的给其他程序赋予root权限.linux ...
- UNIX高级环境编程(13)信号 - 概念、signal函数、可重入函数
信号就是软中断. 信号提供了异步处理事件的一种方式.例如,用户在终端按下结束进程键,使一个进程提前终止. 1 信号的概念 每一个信号都有一个名字,它们的名字都以SIG打头.例如,每当进程调用了ab ...
- Jenkins 角色 项目权限管理
插件名称: Role-based Authorization Strategy 新建 两用户 配置项目安全策略 在系统管理页面点击Manage and Assign Roles进入角色管理页面: 进 ...
- [技术] OIer的C++标准库 : STL入门
注: 本文主要摘取STL在OI中的常用技巧应用, 所以可能会重点说明容器部分和算法部分, 且不会讨论所有支持的函数/操作并主要讨论 C++11 前支持的特性. 如果需要详细完整的介绍请自行查阅标准文档 ...
- Alpha冲刺报告(11/12)(麻瓜制造者)
今日已完成 邓弘立: 整合了主页的功能 符天愉: 大致上完成了留言部分的添加,删除,查询功能 江郑: 测试了剩余四个查询,一个添加接口,也搞定了接口说明. 刘双玉: 测试了剩余四个查询,一个添加接口, ...
- burpsuite联合sqlmap扫描注入点
其实我们在众测的时候完全可以使用burpsuite联合sqlmap测试目标的注入漏洞.对get和post型注入都支持. 先来记录proxy的log , 记住路径 把proxy拦截关掉 接下来浏 ...
- WorldWind源码剖析系列:下载队列类DownloadQueue
下载队列类DownloadQueue代表具有优先级的下载队列,该类的存储下载请求的数组链表专门按一定的优先级来存储下载请求的.该类的类图如下. 下载队列类DownloadQueue各个字段的含义说明如 ...
- redis集群遇到的坑
[root@insure src]# ./redis-cli -c -h 172.16.*.* -p 6370 输入密码: auth 密码 查看节点信息 172.16.*.*:6370> clu ...