朋友在做项目时遇到一个奇怪的问题,那就是在asp.net设计中可以使用UploadFile控件对本地的任何文件以二进制流的方式上传到网络服务器上,其内置了一个打开文件的对话框,非常方便好用。不过随之而来的问题是:我们要上传一个固定的文件,不要用这个文件对话框来选择上传的文件,那么就应该设置UploadFile的FileName属性,我们做了,结果却不是我们想像的那样,这个FileName属性是只读的。不能显示地设置这个属性。那么这个控件就没有办法以我们期望的方式工作,而且我们用HTML语言的<input type=”file”>亦是如此。所以我们舍弃了这个控件,改用Web服务来实现浏览器的上传。
我们这个实现要有两个步骤:
1、我们实现这个web服务的FileUpload(string,string)方法;
2、在网页中调用设置全适的参数调用这个方法。
首先在我们的网站中添加一个Web服务。vs中打开这个服务类,添加一个静态的Upload(string,string)方法。这个方法实现文件的读取和存储实现。代码如下:
web服务文件: |
[WebMethod]//这个服务器特性是必须的 public static void FileUpload(string localPathFile,string webPhysicalPathFile)//localPathFile是本地物理文
//件, webPhysicalPathFile是服务器物理路径 { FileStream inStream=null ; FileStream outStream=null; try { string fileName = localPathFile.Substring(localPathFile.LastIndexOf("\\")+1); //读取本地文件流 inStream = File.OpenRead(localPathFile); string file = webPhysicalPathFile + fileName;//得到网络服务器的文件路径名; outStream = new FileStream(file, FileMode.OpenOrCreate, FileAccess.Write); byte[] bytes = new byte[4096]; int start = 0; int length; while ((length = inStream.Read(bytes, 0, 4096)) > 0) { outStream.Write(bytes, 0, length); start += length; } } catch (Exception e) { throw new Exception("错误出现在:" + e.Message); inStream.Close(); outStream.Close(); } finally { inStream.Close(); outStream.Close(); } }
|
其次在要调用的页面中找到要传输的文件路径信息。由于浏览器是用的网络服务器的虚拟路径,所以我们用Server.MapPath()方法将虚拟路径转换成实际的物理路径。要添加的代码:
调用方法 |
protected void FileUpload_Click(object sender, EventArgs e) { string webPathFile = Server.MapPath(Request.Url.AbsolutePath); string webPath = webPathFile.Substring(0,webPathFile.LastIndexOf("\\") + 1);
//调用Web服务方法 WebService.FileUpload (@"D:\测试文件.doc",webPath ); }
|
现在我们就可以成功地在将本地的文件保存到服务器上了。