.Net 无法打开Offie Open XML文件(上传和下载使用)

  首先,贴一个上传代码:

 1 public static string UploadFileIntoDir(FileUpload MyFile, string DirName)
 2         {
 3             if (IfOkFile(DirName) == true)
 4             {
 5                 string ReturnStr = string.Empty;
 6                 if (MyFile.FileContent.Length > 0)
 7                 {
 8                     MyFile.SaveAs(System.Web.HttpContext.Current.Request.MapPath("../UploadFile/") + DirName);
 9                     //将原文件名与现在文件名写入ERPSaveFileName表中
10                     //string NowName = DirName;
11                     //修改下载文件换成源文件名称 + 时间节
12                     string NowName = DirName;
13                     string OldName = MyFile.FileName;
14                     string SqlTempStr = "insert into ERPSaveFileName(NowName,OldName) values (‘" + NowName + "‘,‘" + OldName + "‘)";
15                     ZWL.DBUtility.DbHelperSQL.ExecuteSQL(SqlTempStr);
16                     return OldName;
17                 }
18                 else
19                 {
20                     return ReturnStr;
21                 }
22             }
23             else
24             {
25                 if (MyFile.FileName.Length > 0)
26                 {
27                     System.Web.HttpContext.Current.Response.Write("<script>alert(‘不允许上传此类型文件!‘);</script>");
28                     return "";
29                 }
30                 else
31                 {
32                     return "";
33                 }
34             }
35         }

  这里的意思就是上传一个简单的文件到服务器,就是到相对于项目路径的文件夹下面。

  然后,贴一个下载代码:

 1         System.IO.Stream iStream = null;
 2         byte[] buffer = new Byte[100000];
 3         int length;
 4         long dataToRead;
 5         string filepath = System.Web.HttpContext.Current.Server.MapPath(FilePath);
 6         string filename = System.IO.Path.GetFileName(filepath);
 7         try
 8         {
 9             iStream = new System.IO.FileStream(filepath, System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.Read);
10             dataToRead = iStream.Length;
11             Response.ContentType = "application/octet-stream";
12             Response.AddHeader("Content-Disposition", "attachment; filename=" + System.Web.HttpUtility.UrlEncode(FileName));
13             while (dataToRead > 0)
14             {
15                 if (Response.IsClientConnected)
16                 {
17                     length = iStream.Read(buffer, 0, 100000);
18                     Response.OutputStream.Write(buffer, 0, length);
19                     Response.Flush();
20                     buffer = new Byte[100000];
21                     dataToRead = dataToRead - length;
22                 }
23                 else
24                 {
25                     dataToRead = -1;
26                 }
27             }
28         }
29         catch (Exception ex)
30         {
31             string message = ex.Message;
32             this.Page.ClientScript.RegisterStartupScript(GetType(), "Message", "<script>alert(‘Error : " + message + "‘);</script>");
33         }
34         finally
35         {
36             if (iStream != null)
37             {
38                 iStream.Dispose();
39             }
40         }

  这里的代码之所以这么写是因为需要流处理数据。

  顺便给大家一个小小的下载提示:我们保存文件的时候害怕文件同名会用DateTime.Now.Ticks来防止文件名重复,但是下载的时候就有一个苦恼了,大家看着一大推的数字,根本分不清楚到底哪个是哪个,那么,现在可以建立一个独立的页面,然后,这个页面就只有这个方法,就像二进制图片的我们要释放那样,首先建立一个独立的页面,然后从后台的二进制传递上来的时候去接收,然后再另外的页面放img标签,把这个二进制的页面给放进去,就是这样,我们就可以给文件任意命名了。

  到了主题了,主题就是这里的下载有问题,03和03以下的office组件可以任意,但是07的组件,因为存在备份文件(特别是docx),下载之后打开的时候会出现

小伙伴们千万不要着急,这个问题我也遇到了(这是点击确定,然后继续点击是,还是可以得到原来的信息的么),通过两天的纠结,问题的根找出来了,就是流搞的鬼,因为这里的流虽然finally释放了,但是因为备份,所以释放的并不完整,那么

请使用 using{}

 1 string filepath = System.Web.HttpContext.Current.Server.MapPath(FilePath);
 2         string filename = System.IO.Path.GetFileName(FilePath);
 3         using (var iStream = new System.IO.FileStream(filepath, System.IO.FileMode.Open,
 4                     System.IO.FileAccess.Read, System.IO.FileShare.Read))
 5         {
 6             Response.Clear();
 7             Response.ContentEncoding = System.Text.Encoding.UTF8;
 8             Response.ContentType = "application/octet-stream";
 9             Response.AddHeader("Content-Disposition", "attachment; filename=" +
10                 System.Web.HttpUtility.UrlEncode(FileName));
11             iStream.CopyTo(Response.OutputStream);
12             Response.End();
13         }

还是.Net Framework设计的好呀,直接using,把人家发现的内存直接释放,完美解决

至于平时的文件说的 无法打开 Office Open Xml,请点击此处

时间: 2024-10-01 10:46:18

.Net 无法打开Offie Open XML文件(上传和下载使用)的相关文章

springboot+web文件上传和下载

一.首先安装mysql数据库,开启web服务器. 二.pom.xml文件依赖包配置如下: <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocatio

JavaWeb学习总结(五十)——文件上传和下载

在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用Servlet获取上传文件的输入流然后再解析里面的请求参数是比较麻烦,所以一般选择采用apache的开源工具common-fileupload这个文件上传组件.这个common-fileupload上传组件的jar包可以去apache官网上面下载,也可以在struts的lib文件夹下面找到,stru

深入分析JavaWeb Item40 -- 文件上传和下载

在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用Servlet获取上传文件的输入流然后再解析里面的请求参数是比较麻烦,所以一般选择采用apache的开源工具common-fileupload这个文件上传组件.这个common-fileupload上传组件的jar包可以去apache官网上面下载,也可以在struts的lib文件夹下面找到,stru

springmvc和servlet下的文件上传和下载(存文件目录和存数据库Blob两种方式)

项目中涉及了文件的上传和下载,以前在struts2下做过,今天又用springmvc做了一遍,发现springmvc封装的特别好,基本不用几行代码就完成了,下面把代码贴出来: FileUpAndDown.jsp <%@ page language="java" contentType="text/html; charset=UTF-8"%> <html> <head> <title>using commons Uplo

struts2中的文件上传和下载

天下大事,必做于细.天下难事,必作于易. 曾经见过某些人,基础的知识还不扎实就去学习更难的事,这样必然在学习新的知识会很迷惑结果 再回来重新学习一下没有搞懂的知识,这必然会导致学习效率的下降!我写的这篇上传和下载都很基础. 十分适合初学者! jsp:页面 <!--在进行文件上传时,表单提交方式一定要是post的方式,因为文件上传时二进制文件可能会很大,还有就是enctype属性,这个属性一定要写成multipart/form-data, 不然就会以二进制文本上传到服务器端--> <for

JavaWeb文件上传和下载

在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用Servlet获取上传文件的输入流然后再解析里面的请 求参数是比较麻烦,所以一般选择采用apache的开源工具common-fileupload这个文件上传组件.这个common- fileupload上传组件的jar包可以去apache官网上面下载,也可以在struts的lib文件夹下面找到,st

Linux 指令篇:文件上传和下载 lrzsz

[ "lrzsz"一般用于SecureCRT ssh中使用 ] 简介:rz,sz是早期Linux/Unix同Windows进行ZModem文件传输的命令行工具.rz ,sz 是非常古老的zmodem协议使用的上传下载命令,早就被抛弃了的东西,目前的发行版基本都不再预装. 优点:比ftp命令方便,而且服务器不用打开FTP服务. 命令sz:将选定的文件发送(send)到本地机器 命令rz:运行该命令会弹出一个文件选择窗口,从本地选择文件上传到Linux服务器. lrzsz安装方法: [[e

JavaWeb学习总结,文件上传和下载

在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用Servlet获取上传文件的输入流然后再解析里面的请求参数是比较麻烦,所以一般选择采用apache的开源工具common-fileupload这个文件上传组件.这个common-fileupload上传组件的jar包可以去apache官网上面下载,也可以在struts的lib文件夹下面找到,stru

java里面的文件上传与下载

文件的上传与下载主要用到两种方法:1.方法一:commons-fileupload.jar commons-io.jarapache的commons-fileupload实现文件上传,下载 [upload]package com.handson.bbs.servlet; import java.io.File;import java.io.IOException;import java.util.Date;import java.util.List;import javax.servlet.Se

jsp文件上传、下载

一.文件上传 上传文件是Web开发中经常要用到的功能:例如在基于B/S的人事信息管理系统中上传照片,在新闻发布系统中上传图片等等.....要实现文件上传功能,就需要综合利用java中的文件输入和输出相关的类. 在TCP/IP中,最早出现的文件上传机制是FTP.它是将文件由客服端发送到服务器的标准机制,能够考虑到跨平台的文本和二进制格式文件.但是在jsp编程中不能使用FTP方法来上传文件,这是由jsp 运行机制所决定的. 下面是上传文件的jsp页面: [html] view plaincopypr