如何通过Web Services上传和下载文件
随着Internet技术的发展和跨平台需求的日益增加 Web Services的应用越来越广 我们不但需要通过Web Services传递字符串信息 而且需要传递二进制文件信息 下面 我们就分别介绍如何通过Web Services从服务器下载文件到客户端和从客户端通过Web Services上载文件到服务器
一 通过Web Services显示和下载文件
我们这里建立的Web Services的名称为GetBinaryFile 提供两个公共方法 分别是GetImage()和GetImageType() 前者返回二进制文件字节数组 后者返回文件类型 其中 GetImage()方法有一个参数 用来在客户端选择要显示或下载的文件名字 这里我们所显示和下载的文件可以不在虚拟目录下 采用这个方法的好处是 可以根据权限对文件进行显示和下载控制 从下面的方法我们可以看出 实际的文件位置并没有在虚拟目录下 因此可以更好地对文件进行权限控制 这在对安全性有比较高的情况下特别有用 这个功能在以前的ASP程序中可以用Stream对象实现 为了方便读者进行测试 这里列出了全部的源代码 并在源代码里进行介绍和注释
首先 建立GetBinaryFile a x文件
我们可以在VS NET里新建一个C#的aspxWebCS工程 然后 添加新项 选择 Web服务 并设定文件名为 GetBinaryFile a x 在 查看代码 中输入以下代码 即 GetBinaryFile a x cs
using System;
using System Collections;
using System ComponentModel;
using System Data;
using System Diagnostics;
using System Web;
using System Web UI;
using System Web Services;
using System IO;
namespace aspxWebCS
{
///
/// GetBinaryFile 的摘要说明
/// Web Services名称 GetBinaryFile
/// 功能 返回服务器上的一个文件对象的二进制字节数组
///
[WebService(Namespace=
Description= 在Web Services里利用 NET框架进行传递二进制文件 )]
public class GetBinaryFile : System Web Services WebService
{
#region Component Designer generated code
//Web 服务设计器所必需的
private IContainer ponents = null;
///
/// 清理所有正在使用的资源
///
protected override void Dispose( bool disposing )
{
if(disposing &&ponents != null)
{
ponents Dispose();
}
base Dispose(disposing);
}
#endregion
public class Images: System Web Services WebService
{
///
/// Web 服务提供的方法 返回给定文件的字节数组
///
[WebMethod(Description= Web 服务提供的方法 返回给定文件的字节数组 )]
public byte[] GetImage(string requestFileName)
{
///得到服务器端的一个
///如果你自己测试 注意修改下面的实际物理路径
if(requestFileName == null || requestFileName == )
return getBinaryFile( D:\Picture JPG );
else
return getBinaryFile( D:\ + requestFileName);
}
///
/// getBinaryFile 返回所给文件路径的字节数组
///
///
public byte[] getBinaryFile(string filename)
{
if(File Exists(filename))
{
try
{
///打开现有文件以进行读取
FileStream s = File OpenRead(filename);
return ConvertStreamToByteBuffer(s);
}
catch(Exception e)
{
return new byte[ ];
}
}
else
{
return new byte[ ];
}
}
///
/// ConvertStreamToByteBuffer 把给定的文件流转换为二进制字节数组
///
///
public byte[] ConvertStreamToByteBuffer(System IO Stream theStream)
{
int b ;
System IO MemoryStream tempStream = new System IO MemoryStream();
while((b =theStream ReadByte())!= )
{
tempStream WriteByte(((byte)b ));
}
return tempStream ToArray();
}
[WebMethod(Description= Web 服务提供的方法 返回给定文件类型 )]
public string GetImageType()
{
///这里只是测试 您可以根据实际的文件类型进行动态输出
return image/jpg ;
}
}
}
}
观看地址 进入讨论组讨论
一旦我们创建了上面的a x文件 进行编译后 我们就可以编写客户端的代码来进行调用这个Web Services了
我们先 添加Web引用 输入 下面 我们编写显示文件的中间文件 GetBinaryFileShow aspx 这里 我们只需要在后代码里编写代码即可 GetBinaryFileShow aspx cs文件内容如下
using System;
using System Collections;
using System ComponentModel;
using System Data;
using System Drawing;
using System Web;
using System Web SessionState;
using System Web UI;
using System Web UI WebControls;
using System Web UI HtmlControls;
using System Web Services;
namespace aspxWebCS
{
///
/// GetBinaryFileShow 的摘要说明
///
public class GetBinaryFileShow : System Web UI Page
{
private void Page_Load(object sender System EventArgs e)
{
// 在此处放置用户代码以初始化页面
///定义并初始化文件对象
aspxWebCS GetBinaryFile Images oImage;
oImage = new aspxWebCS GetBinaryFile Images();
///得到二进制文件字节数组
byte[] image = oImage GetImage( );
///转换为支持存储区为内存的流
System IO MemoryStream memStream = new System IO MemoryStream(image);
///定义并实例化Bitmap对象
Bitmap bm = new Bitmap(memStream);
///根据不同的条件进行输出或者下载
Response Clear();
///如果请求字符串指定下载 就下载该文件
///否则 就显示在浏览器中
if(Request QueryString[ Download ]== )
{
Response Buffer = true;
Response ContentType = application/octet stream ;
///这里下载输出的文件名字 ok jpg 为例子 你实际中可以根据情况动态决定
Response AddHeader( Content Disposition attachment;filename=ok jpg );
}
else
Response ContentType = oImage GetImageType();
Response BinaryWrite(image);
Response End();
}
#region Web Form Designer generated code
override protected void OnInit(EventArgs e)
{
//
// CODEGEN 该调用是 ASP NEeb 窗体设计器所必需的
//
InitializeComponent();
base OnInit(e);
}
///
/// 设计器支持所需的方法 不要使用代码编辑器修改
/// 此方法的内容
///
private void InitializeComponent()
{
this Load += new System EventHandler(this Page_Load);
}
#endregion
}
}
最后 我们就编写最终的浏览页面 GetBinaryFile aspx 这个文件很简单 只需要aspx文件即可 内容如下
<%@ Page language="c#" Codebehind="GetBinaryFileaspxcs" AutoEventWireup="false"
Inherits="aspxWebCSGetBinaryFile" %> Inherits= aspxWebCS GetBinaryFile %>
runat= server > runat= server >下载文件
收藏地址:进入讨论组讨论
using System;
using System Collections;
using System ComponentModel;
using System Data;
using System Diagnostics;
using System Web;
using System Web Services;
using System IO;
namespace aspxWebCS
{
///
/// Upload 的摘要说明
///
[WebService(Namespace=
Description= 在Web Services里利用 NET框架进上载文件 )]
public class Upload : System Web Services WebService
{
public Upload()
{
//CODEGEN 该调用是 ASP NEeb 服务设计器所必需的
InitializeComponent();
}
#region Component Designer generated code
//Web 服务设计器所必需的
private IContainer ponents = null;
///
/// 设计器支持所需的方法 不要使用代码编辑器修改
/// 此方法的内容
///
private void InitializeComponent()
{
}
///
/// 清理所有正在使用的资源
///
protected override void Dispose( bool disposing )
{
if(disposing &&ponents != null)
{
ponents Dispose();
}
base Dispose(disposing);
}
#endregion
[WebMethod(Description= Web 服务提供的方法 返回是否文件上载成功与否 )]
public string UploadFile(byte[] fs string FileName)
{
try
{
///定义并实例化一个内存流 以存放提交上来的字节数组
MemoryStream m = new MemoryStream(fs);
///定义实际文件对象 保存上载的文件
FileStream f = new FileStream(Server MapPath( ) + \
+ FileName FileMode Create);
///把内内存里的数据写入物理文件
m WriteTo(f);
m Close();
f Close();
f = null;
m = null;
return 文件已经上传成功 ;
}
catch(Exception ex)
{
return ex Message;
}
}
}
}
using System;
using System Collections;
using System ComponentModel;
using System Data;
using System Drawing;
using System Web;
using System Web SessionState;
using System Web UI;
using System Web UI WebControls;
using System Web UI HtmlControls;
using System Web Services;
using System IO;
namespace aspxWebCS
{
///
/// Upload 的摘要说明
/// 利用该方法通过Web Services上载文件
///
public class Upload : System Web UI Page
{
protected System Web UI HtmlControls HtmlInputFile MyFile;
protected System Web UI WebControls Button Button ;
private void Page_Load(object sender System EventArgs e)
{
// 在此处放置用户代码以初始化页面
}
#region Web Form Designer generated code
override protected void OnInit(EventArgs e)
{
//
// CODEGEN 该调用是 ASP NEeb 窗体设计器所必需的
//
InitializeComponent();
base OnInit(e);
}
///
/// 设计器支持所需的方法 不要使用代码编辑器修改
/// 此方法的内容
///
private void InitializeComponent()
{
this Button Click += new System EventHandler(this Button _Click);
this Load += new System EventHandler(this Page_Load);
}
#endregion
private void Button _Click(object sender System EventArgs e)
{
///首先得到上载文件信息和文件流
if(MyFile PostedFile != null)
{
System Web HttpFileCollection oFiles;
oFiles = System Web HttpContext Current Request Files;
if(oFiles Count < )
{
Response Write ( 请选择文件 );
Response End();
}
string FilePath = oFiles[ ] FileName;
if(FilePath == || FilePath == null)
{
Response Write ( 请选择一个文件 );
Response End();
}
string FileName = FilePath Substring(FilePath LastIndexOf( \ )+ );
try
{
///处理上载的文件流信息
byte[] b = new byte[oFiles[ ] ContentLength];
System IO Stream fs;
aspxWebCS Upload o;
o = new aspxWebCS Upload();
fs = (System IO Stream)oFiles[ ] InputStream;
fs Read(b oFiles[ ] ContentLength);
///调用Web Services的UploadFile方法进行上载文件
Response Write(o UploadFile(b FileName));
fs Close();
}
catch(Exception ex)
{
Response Write(ex Message);
}
}
else
{
Response Write( 请选择文件 );
}
}
}
}
最后 需要注意的是 在保存文件时 您应该确保指定文件的完整路径(例如 C:MyFilesPicture jpg ) 并确保为 ASP NET使用的帐户提供要存储文件的目录的写权限 上载大文件时 可使用 元素的 maxRequestLength 属性来增加文件大小的最大允许值 其中 maxRequestLength 指示 ASP NET 支持的HTTP方式上载的最大字节数 该限制可用于防止因用户将大量文件传递到该服务器而导致的拒绝服务攻击 指定的大小以 KB 为单位 默认值为 KB ( MB) executionTimeout 指示在被 ASP NET 自动关闭前 允许执行请求的最大秒数 在当文件超出指定的大小时 如果浏览器中会产生 DNS错误或者出现服务不可得到的情况 也请修改以上的配置 把配置数加大
另外 上载大文件时 还可能会收到以下错误信息
aspnet_wp exe (PID: ) 被回收 因为内存消耗超过了 MB(可用 RAM 的百分之 )
如果遇到此错误信息 请增加应用程序的 nfig 文件的 元素中 memoryLimit 属性的值
lishixinzhi/Article/program/net/201311/12410
常用的三种方法!
1:在服务器上建立一个WEB网站,然后把要下载的文件压缩一下打包,再然后放到建好的WEB网站的根目录,然后网址再加一个打包的文件名就可以在本地下载了。这就是所说的在服务器上做一个下载点
2:在服务器上安装FTP的服务端,然后在本地的FTP客户端里下载文件
3:在服务器里进邮箱把文件传到邮箱里,然后在本地打开邮箱进去下载文件
看你是什么服务器了~~
ftp服务器的话需要输入
ftp://xxxxxxxxxxxxxip地址,如果需要用户名密码的话输入就可以了~~
打开后,想下载哪个就下载哪个,可以直接拖动到你的计算机上的任何一个磁盘里,也可以借助一些FTP下载工具进行下载。如果是网页页面形式的话,在要下载的文件处单击鼠标右键,目标另存为即可
通过远程连接可以实现服务器和本地电脑文件互相复制粘贴,具体操作步骤如下:
1同时按下键盘的“win”键和“r”字母键
2弹出“运行”窗口
3在输入框内输入“mstsc”,按下“Enter”键或点“确定”按钮
4弹出“远程桌面连接”窗口
5点下面的 选项 按钮
6弹出 选项 窗口
7点击 本地资源 选项卡
8选项卡 下面有 本地设备和资源,点击 详细信息
9弹出 详细信息 窗口 点开 驱动器 前面的“+”号
10 把需要在远程服务器访问的磁盘前面打勾,然后确定
11进入服务器,打开服务器桌面上我的电脑,下面的分类就可以看到您勾选的本地磁盘了。可以点击打开浏览,也可以相互复制粘贴文件。
一在服务器上面安装FTP服务端比如说用SERV-U来搭建服务端然后在自己电脑上安装下flashfxp工具用来登录FTP下载文件到本地电脑即可支持断点续传很方便
二登录服务器在服务器上面登录百度网盘把你所要下载的东西打包上传到百度网盘然后在本地电脑登录网盘下载
三登录服务器在服务器上面登录你的邮箱把所需要下载的东西打包发送到你的另一个邮箱在本地电脑登录你的另一个邮箱把文件下载出来
用copy命令,
将远程主机的文件复制到自己的电脑:copy
\\ip地址\c$\文件名\c:\
当然也可以把本地文件复制到远程主机:
copy
c:\文件名\\ip地址\c$
如果是ftp主机比如5944,可以在网页上直接登陆,打开ie输入
ftp://ftp分配给你的ip地址
回车后要在对话框里输入ftp分配的用户和密码
如果登陆成功,可以把浏览器的页面框缩小后以拖拽的方式把ftp上的文件拖到本地桌面。
具体在cmd命令下的ftp命令实在太多,这里就不用说了。
0条评论