最新评论

共2页: 1 2 下一页 
恋上云端的倪 2012-05-10 11:45
粘上我如上所述做的demo,略做修改。但为什么压缩好的文件解压有两个文件,源文件名称无法显示:求解! /// <summary> /// 创建指定文件和压缩文件的对应容器 /// </summary> /// <param name="path">源文件路径</param> /// <param name="name">文件的全名(包括后缀)</param> /// <param name="newpath">压缩文件保存路径</param> /// <param name="newname">压缩文件名</param> protected void FiletoZip(string path,string name,string newpath,string newname) { string oldpath = path +@"\"+ name; string savdpath = newpath+@"\"+ newname + ".Zip"; using (Package Zip = System.IO.Packaging.Package.Open(savdpath, System.IO.FileMode.Create)) { HttpCookie cookie=Request.Cookies["PersonMessage"]; string destFilename = cookie["servername"] + Path.GetFileName(oldpath); Uri uri = PackUriHelper.CreatePartUri(new Uri(destFilename,UriKind.Relative)); if(Zip.PartExists(uri)) { Zip.DeletePart(uri); } PackagePart part = Zip.CreatePart(uri, "application/x-zip-compressed", CompressionOption.Normal); using(FileStream filestream = new FileStream(oldpath,FileMode.Open,FileAccess.Read)) { using(Stream dest=part.GetStream()) { CopyStream(filestream, dest); Response.Write("<script>alert('压缩完成')</script>"); } } } } /// <summary> /// 从源文件的容器的流文件中读到压缩文件的容器的流文件中 /// </summary> /// <param name="inputstream">输入流</param> /// <param name="outputstream">输出流</param> protected void CopyStream( FileStream inputstream,Stream outputstream) { long buffersize = inputstream.Length < Buffer_siez ? inputstream.Length : Buffer_siez; byte[] buffer = new byte[buffersize]; int bytesread = 0; long bytesWritten = 0; while((bytesread = inputstream.Read(buffer,0,buffer.Length))!=0) { outputstream.Write(buffer, 0, bytesread); bytesWritten += buffersize; } }
风疑 2011-05-16 11:16
@Yong Zhang 其实,最终的解决方案和你所说的差不多,还是output管用。 ps:你说,如果在生成压缩的过程中,内存不够了咋办?
风疑 2011-05-16 11:12
@Fish.John 嘘,这是博客园,别乱说话,会被笑话。园里大神很多的。
Fish.John 2011-05-14 22:09
鹏哥,你的博客真的不赖……真好
Yong Zhang 2011-05-12 17:05
@风疑 你的学习精神值得肯定!向你学习。具体到这个问题上面,你可能还自己多Debug一下,个人觉得这里面问题并不大,可以找出贵亏祸首。 “最终是返回的file,并不是直接使用的outputstream,而且在这个page的方法里,貌似只能是file流。” public ActionResult DownLoad(int id) =>DownLoad(int id, Response.OutputStream output)//把下载页面的Response传进来 ==> using (MemoryStream ms = new MemoryStream()) 就不需要了, 直接换成 output. outputStream.Write(buffer, 0, bytesRead); 后面一定要 .Flush(); 这样写入的数据就直接送到了网络上去去了。 按照我的理解,这样就不管多大的文件,多少人同时下载,应该都没有内存问题。
风疑 2011-05-12 16:12
@Yong Zhang 首先,感谢你的回复。 -------- 最直观的就是,当下载的压缩包并不大时,大概在20-30M左右,没事。一旦在大点,就开始报错了。 -> 内存引起的。如果一个用户下载 要30M,10个用户同时下载呢? 此时是单用户,还没考虑到多用户,不过估计同样会出错。 ------ 我在一台服务器上设置了everyone的权限,没事了,当去掉everyone的权限后,错误又出现了 --> 我觉得和这个应该是没有关系,如果说有关系的话,那就是每次都会下载不成功,可能是没有读取文件的权限。总之这个有问题的话,出现的问题的现象不应该是你描述的那样。 问题确实是存在的,没有everyone权限的时候,下载小的文件时不会出错的,当然还是单用户。不过我估计可能会跟下面的问题有关联。 ------- 个人的想法是:压缩包从内存流中读取,然后通过文件流进行写入,此时应当会产生一个临时文件,但是这个临时文件的大小是受限的,一旦太大 就无法继续进行写入了。从而关闭文件流 -> 使用MemoryStream 肯定不会产生临时文件。 最终是返回的file,并不是直接使用的outputstream,而且在这个page的方法里,貌似只能是file流。 ------ 其实,我已经解决了,但是是用的另外一种方案,只不过我心里很纠结,想弄明白为什么这种方式会出错。 再次感谢你的回复。
Yong Zhang 2011-05-12 12:33
最直观的就是,当下载的压缩包并不大时,大概在20-30M左右,没事。一旦在大点,就开始报错了。 -> 内存引起的。如果一个用户下载 要30M,10个用户同时下载呢? 我在一台服务器上设置了everyone的权限,没事了,当去掉everyone的权限后,错误又出现了 --> 我觉得和这个应该是没有关系,如果说有关系的话,那就是每次都会下载不成功,可能是没有读取文件的权限。总之这个有问题的话,出现的问题的现象不应该是你描述的那样。 个人的想法是:压缩包从内存流中读取,然后通过文件流进行写入,此时应当会产生一个临时文件,但是这个临时文件的大小是受限的,一旦太大 就无法继续进行写入了。从而关闭文件流 -> 使用MemoryStream 肯定不会产生临时文件。 综上: 1) 仔细检查出问题的时候内存方面的情况。是一个用户引起的,还是多个用户同时操作引起的。 2)最佳的解决方案应该是边压缩,边下载。但是要注意,每次要stream.Flush, 这样就不会有问题了。你可以超这个思路去想,具体代码你自己在网上找找。
风疑 2011-05-05 14:55
@根号贰 比我的代码优雅多了。
根号贰 2011-04-25 23:07
我在想,要是有100个列要排序怎么办? 试试这个: static IOrderedQueryable<T> ApplyOrder<T>(IQueryable<T> source, string property, string methodName) { Type type = typeof(T); ParameterExpression arg = Expression.Parameter(type, "a"); PropertyInfo pi = type.GetProperty(property); Expression expr = Expression.Property(arg, pi); type = pi.PropertyType; Type delegateType = typeof(Func<,>).MakeGenericType(typeof(T), type); LambdaExpression lambda = Expression.Lambda(delegateType, expr, arg); object result = typeof(Queryable).GetMethods().Single( a => a.Name == methodName && a.IsGenericMethodDefinition && a.GetGenericArguments().Length == 2 && a.GetParameters().Length == 2).MakeGenericMethod(typeof(T), type).Invoke(null, new object[] { source, lambda }); return (IOrderedQueryable<T>)result; } 调用方法:property对应列名,methodName:Asc,Desc
xiaozhi_5638 2010-05-12 21:37
怎样将excel中多个表 sheet1$ 、sheet2$ ……读出来呢? 怕是先要读出excel中的表名称不?
cloudbee 2010-05-06 11:43
感谢你的方法,终于能够用实体传参了,我找了一早上了。 可能把web service重载几次吧,这样也方便Java调用 不放弃,要坚定
Higuch 2009-10-12 11:12
[quote]T_cat: < ! --****************注释***************--><br/><br/><br/>用以上的注解照样问题,firefox 就是很严格<br/><br/>真正的原因是<br/><br/>注解时必须两边的符号一样多,否则出错,我本人亲自测试,谁说不是和他急<br/><br/> 3楼,和5楼的都没说全,firefox是要求严格,和或比xhtml更严格 所以说程序员拿FIREFOX来测试程序就是好.[/quote]
T_cat 2009-05-24 21:40
< ! --****************注释***************-->


用以上的注解照样问题,firefox 就是很严格

真正的原因是

注解时必须两边的符号一样多,否则出错,我本人亲自测试,谁说不是和他急

3楼,和5楼的都没说全,firefox是要求严格,和或比xhtml更严格 所以说程序员拿FIREFOX来测试程序就是好.
yeml 2009-03-26 09:50
楼上有两位不错。心水很清

我最近也做了remoting的,不过我直接用soap service和client

当然,这需要装个iis
风疑 2009-03-26 08:36
@yuguohua
@一叶一菩提,一花一世界
多谢二位无私的解答,使我受益匪浅,确实是将AttendanceInfo类的继承MarshalByRefObject去掉就可以了,直接mark成Serializable。这样程序正常运行,不需要在动其他代码。看来还是对remoting的机制不是特别清楚的原因。再次感谢二位,也感谢在百忙之中回复的朋友。
一叶一菩提,一花一世界 2009-03-25 22:02
很简单,我跟你调了一下结果把一个dll的名字写错了,搞了我个把小时,nnd,真郁闷啊,看来晚上不适宜看程序。

你所有的server端的类都即继承自MarshalByRefObject 又把它mark成Serializable,这里太乱,你说它在rpc的时候到底是By Value还是By Reference呢? 这个就不得而知了,我也不知道,如果这样的romting的框架会怎么样去选择,如果它也不知道哦怎么选择,那它不就要出错了么?哈哈

你可以把AttendanceInfo这个类就Mark成Serializable,然后把AttendanceBase继承与自MarshalByRefObject,Attendance继承自AttendanceBase(去掉Serializable)就好了。

哈哈,你要用remoting,就要明明白白的告诉Remoting Framework你到底想干什么?By Value or By Reference?
yuguohua 2009-03-25 21:47
因為 AttendanceInfo : MarshalByRefObject
所以bai 的instance是建立在client, 當bai傳至server時, 只有reference.要讀取bai的內容時, 須再與client溝通, 而client並沒有提供溝通channel.

請把 MarshalByRefObject 拿掉就可以解決問題.
黄泉天上来 2009-03-25 19:54
客户端没有注册管道 加上一下代码

BinaryServerFormatterSinkProvider serverProvider = new
BinaryServerFormatterSinkProvider();
BinaryClientFormatterSinkProvider clientProvider = new
BinaryClientFormatterSinkProvider();
serverProvider.TypeFilterLevel = TypeFilterLevel.Full;

IDictionary props = new Hashtable();
props["port"] = 0;
HttpChannel channel = new HttpChannel(props,clientProvider,serverProvider);
ChannelServices.RegisterChannel(channel);


客户端通道的端口号应设置为0,这表示客户端自动选择可用的端口号。如果要设置为指定的端口号,则必须保证与服务端通道的端口号不相同。

什么原因不清楚 本人也是刚学remoting 以上代码来自
http://www.cnblogs.com/wayfarer/articles/75213.html
myjece 2009-03-25 19:52
你的程序与序列化没什么关系,因为你在你的实体类已经申明为可序列化的

共2页: 1 2 下一页