socamp 发表于 2014-8-27 01:32:00

无法上传的问题

使用spread for silverlight,在网页中部署,现在的问题是:
1、客户要求生成的excel报表能够批量下载,所有只有在发布报表的时候,生成excel文件,并上传到服务器
2、处理流程:
   (1)从服务器上下载Excel报表模板
   (2)读取数据库使用Spread往Excel中填充数据
    (3)用户点击确定按钮,使用SaveExcel方法保存流,并将数据上传到服务器
3、问题:
   (1)无法上传
   提示:无法访问已释放的对象。
   对象名:“MS.Internal.InternalMemoryStream”。
   (2)silverlight的上传机制是否必须要求用户点击filedialog从本地选取文件进行上传?上述上传方式是否是silverlight安全机制所禁止的?
   (3)你们有没有好的解决方法?

iceman 发表于 2014-8-27 10:47:00

回复 1楼socamp的帖子

(1)无法上传
请问在保存之前是否已经把这个流关闭了?因为spread在saveexcel时是不会关闭流文件的。

(2)silverlight的上传机制是否必须要求用户点击filedialog从本地选取文件进行上传?
是 Silverlight 的安全机制,你的理解是对的,Silverlight 应用有关客户端文件的操作都必须通过 OpenFileDialog 和 SaveFileDialog 操作。

socamp 发表于 2014-8-27 11:12:00

那目前你们有没有好的解决方法呢?能否获取到spread的byte[]数据,如果能获取的话,我可以将其转成0~F的字符串Post到服务器,然后在服务器上遍历字符串将其转成文件。

iceman 发表于 2014-8-27 18:49:00

回复 3楼socamp的帖子

可以首先使用以下方法保存成 Stream,

gcSpreadSheet1.SaveExcel(stream, GrapeCity.Windows.SpreadSheet.Data.ExcelFileFormat.XLSX);


然后把 Stream 转换byte,提供给链接供您参考,希望对您有帮助:
http://msdn.microsoft.com/en-us/library/dhx0d524(v=vs.110).aspx

socamp 发表于 2014-8-28 10:34:00

gcSpreadSheet1.SaveExcel这个方法还是需要通过文件对话框获取stream,有没有其他创建stream的方法?

socamp 发表于 2014-8-28 11:27:00

问题解决,用MemoryStream代替Stream进行上传即可,没有想得那么麻烦。代码如下(项目中拷贝过来简化后的代码,不保证能直接执行):
MemoryStream ms = new MemoryStream();
gcSpreadSheet1.SaveExcel(ms, ExcelFileFormat.XLSX);
WebClient webClient = new WebClient();
webClient.OpenWriteCompleted += (r,args) =>{
try
                {
                  Stream stream = args.Result;
                  byte[] buffer = new byte;
                  int readcount = 0;
                  fileStream.Position = 0;
                  //将需要上传的流读取到指定的字节数组中
                  while ((readcount = fileStream.Read(buffer, 0, buffer.Length)) > 0)
                  {
                        //将指定的字节数组写入到目标地址的流
                        stream.Write(buffer, 0, readcount);
                  }
                  fileStream.Close();
                  stream.Close();

                  if (DoActionCompleted != null)
                        DoActionCompleted();
                }
                catch (Exception ee)
                {
                  //throw new Exception(ee.Message.ToString());
                }
}

谢谢版主。。

socamp 发表于 2014-8-28 11:28:00

少了一句,在第三行
webClient.OpenWriteAsync(path, "POST", ms );

socamp 发表于 2014-8-28 11:37:00

错,在第四行:L

iceman 发表于 2014-8-28 16:09:00

回复 8楼socamp的帖子

好的,感谢您反馈问题结果。
页: [1]
查看完整版本: 无法上传的问题