电子文件管理系统开发文档_第1页
电子文件管理系统开发文档_第2页
电子文件管理系统开发文档_第3页
电子文件管理系统开发文档_第4页
电子文件管理系统开发文档_第5页
已阅读5页,还剩78页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、资料管理系统开发文档徐梁2015.4.19 Version 1.0 资料管理系统开发文档1一、需求分析与功能简介4二、整体架构4三、文件浏览功能实现5四、单个文件下载功能实现8五、文件夹下载功能实现10六、范围搜索功能实现14(一)范围精确搜索功能实现14(二)范围模糊搜索功能实现16七、快速搜索功能实现16(一) 数据库结构16(二) 服务器程序连接数据库17八、客户端监听程序(云同步)20附录 122工程的目录结构:22basic.jsp源代码24basic_error.jsp源代码28Socketerror.jsp源代码28SocketPro.jsp源代码29SocketSuccess.

2、html源代码29Success.jsp源代码30lib所需要的文件30JQuery+JQueryUI31struts.xml源代码32filesearch.java源代码35FileSize.java源代码36ZIP.java源代码38Fast_is_search.java源代码40fast_like_search.java源代码42normal_is_search.java源代码44Normal_like_search.java源代码47searchAction.java源代码50FileDownloadPackage.java源代码55FolderZIP.java源代码56ServerS

3、ocketAction.java源代码59SocketAction.java源代码61filedownloadAction.java源代码64附录 266Information_Port源代码67MainPro源代码70Progress.java源代码71Server_Port.java源代码72UI.java源代码75DiskCode.java源代码79UIDeCode.java源代码80一、功能简介随着时间的积累,文件资料变得越来越多。在短短3年的时间里文件资料已经增长到了2T并且正在快速增长,查找和管理变得越来越困难。但是传统的FTP软件只拥有简单的查阅和下载功能而且没有搜索功能,已经无

4、法满足大数据条件下的资料管理和快速有效的查找文资料。中队在资料管理方面迫切需要一款能够有效管理大量数据文件资料的软件。首先软件需要完成以下功能:1. 类似于FTP软件的文件浏览浏览功能。2. 资料文件的单个下载。3.资料文件的批量下载。4.文件的精确搜索。5.文件夹的精确搜索。6.文件的模糊搜索。7.文件夹的模糊搜索。8.文件的范围精确搜索。9.文件夹的范围模糊搜索。10.权限控制,根据登录账号的类型,拥有不同的权限。例如超级管理员拥有上传、下载、修改以及后台操作数据库的权限。而普通用户只有下载和查看的权限。二、整体架构程序采用B/S的全局架构,B/S结构即浏览器和服务器结构。它是随着Inte

5、rnet技术的兴起,对C/S结构的一种变化或者改进的结构。在这种结构下,用户工作界面是通过WWW浏览器来实现,极少部分事务逻辑在前端(Browser)实现,但是主要事务逻辑在服务器端(Server)实现,形成所谓三层3-tier结构。B/S结构是WEB兴起后的一种网络结构模式,WEB浏览器是客户端最主要的应用软件。这种模式统一了客户端,将系统功能实现的核心部分集中到服务器上,简化了系统的开发、维护和使用。客户机上只要安装一个浏览器(Browser),如Netscape Navigator或Internet Explorer,服务器安装Oracle、Sybase、Informix或SQL Ser

6、ver等数据库。浏览器通过Web Server同数据库进行数据交互。这样就大大简化了客户端电脑载荷,减轻了系统维护与升级的成本和工作量,降低了用户的总体成本(TCO)。程序前端采用JSP实现文件夹结构的显示。核心采用Strtus2作为程序核心处理模块。所有JSP网页采用全动态显示技术。JSP在服务器端运行后,动态的生成所需要的HTML5+CSS3标签语言的语句。实现网页标签语句由服务器自动生成。如图1所示。图1 架构总体图Struts 2是Struts的下一代产品,是在struts 1和WebWork的技术基础上进行了合并的全新的Struts 2框架。其全新的Struts 2的体系结构与Str

7、uts 1的体系结构差别巨大。Struts 2以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与ServletAPI完全脱离开,所以Struts 2可以理解为WebWork的更新产品。虽然从Struts 1到Struts 2有着太大的变化,但是相对于WebWork,Struts 2的变化很小。当Web容器收到请求(HttpServletRequest)它将请求传递给一个标准的的过滤链包括(ActionContextCleanUp)过滤器,然后经过Other filters(SiteMesh ,etc),接下来需要调用FilterDispatcher核

8、心控制器,然后它调用ActionMapper确定请求哪个Action,ActionMapper返回一个收集Action详细信息的ActionMaping对象。接下来FilterDispatcher将控制权委派给ActionProxy,ActionProxy调用配置管理器(ConfigurationManager) 从配置文件中读取配置信息(struts.xml),然后创建ActionInvocation对象,ActionInvocation在调用Action之前会依次的调用所用配置拦截器(Interceptor N) 一旦执行结果返回结果字符串ActionInvocation负责查找结果字符串

9、对应的(Result)然后执行这个Result Result会调用一些模版(JSP)来呈现页面,之后拦截器(Interceptor N)会在被执行(顺序和Action执行之前相反)最后响应(HttpServletResponse)被返回在web.xml中配置的那些过滤器和(核心控制器)(FilterDispatcher)。三、文件浏览功能实现文件浏览功能的实现分为三个步骤:1. 生成后的网页如图2所示:图2 网页前端页面2. 页面核心代码如下所示:<%int dl=(int)session.getAttribute("directoryNumber");for(int

10、 j=0;j<dl;j+)String ip=request.getLocalAddr();String dname=(String)session.getAttribute("directoryname"+j);String durl=(String)session.getAttribute("directory"+j);String dsize=(String)session.getAttribute("directorysize"+j);String directory="<tr class='li

11、'><td id='name'><a href='filesearch?url="+durl+"'><img src='imgs/文件夹.png' onclick='submit()'><span>"+dname+"</span></a></td><td>"+dsize+"</td><td><a href='FolderZIP

12、?url="+durl+"&name="+dname+"&IP="+ip+"'><span id='down'>下载</span></a></td></tr>"out.append(directory);out.flush();int fl=(int)session.getAttribute("fileNumber");for(int j=0;j<fl;j+)String fname=(Stri

13、ng)session.getAttribute("filename"+j);String furl=(String)session.getAttribute("file"+j);String filesize=(String)session.getAttribute("filesize"+j);String file="<tr class='li'><td id='name'><a href='filedownload?url="+furl+&q

14、uot;&filename="+fname+"'><img src='imgs/文件.png' onclick='submit()'><span>"+fname+"</span></a></td><td>"+filesize+"</td><td><a href='filedownload?url="+furl+"&filename="+

15、fname+"'><span id='down'>下载</span></a></td></tr>"out.append(file);out.flush();%>3.用户通过网页点击网页上的文件夹,产生一个请求。服务器获取请求,交给Action类处理。关键代码如下所示: for(int i=0;i<List.length;i+) if(Listi.isFile() System.out.println("文件:"+Listi); session.put(&

16、quot;filesize"+fileNumber, (Listi.length()/1000000)+"Mb"); session.put("file"+fileNumber, Listi.getPath(); session.put("filename"+fileNumber,Listi.getName(); fileNumber+; for(int i=0;i<List.length;i+) if(Listi.isDirectory() System.out.println("文件夹:"+Li

17、sti); System.out.println("文件夹名:"+Listi.getName(); session.put("directory"+directoryNumber, Listi.getPath(); session.put("directoryname"+directoryNumber, Listi.getName(); session.put("directorysize"+directoryNumber, (Listi.length()/1000000)+"Mb"); dir

18、ectoryNumber+; session.put("fileNumber", fileNumber); session.put("directoryNumber", directoryNumber);return SUCCESS在文件浏览是,为了防止用户访问服务器的其他区域,需要加一个访问路径的限定,实现代码如下所示:public String execute()session.clear();if(url.indexOf("j:file")=-1)/规定文件路径访问范围范围(代表)System.out.println(url.i

19、ndexOf("j:file");return ERROR;4. FileSize.java实现文件的计算,因为文件夹内部有很多个文件,全部计算耗费的运算资源是巨大的。所以只计算单个文件的大小。当文件大小小于1MB时,文件已无大小计算必要,所以不计算大小,与文件夹一样大小显示为0MB。关键代码如下所示:public void getsize( File file) File List= file.listFiles(); System.out.println("该目录下对象个数:"+List.length); for(int i=0;i<List.

20、length;i+) if(Listi.isFile() System.out.println("文件:"+Listi); num+; size=size+Listi.length()/1000000; if(size>3000|num>15000)/大于2G break; if(Listi.isDirectory() System.out.println("文件夹:"+Listi); getsize(Listi); Strtus2获取文件夹列表后,将文件名、文件路径、文件大小存入session内,然后根据session里内容的不同,在服务器

21、端生成相应的页面代码。返回给用户浏览器,完成一次浏览。如图3所示:图3 响应页面四、单个文件下载功能实现单个文件的下载采用Strtus2实现。首先需要配置一个Action的拦截器,拦截filedownlaod请求。打开Strtus.xml配置一个Action,具体代码如下所示: <action name="filedownload" class="UPDownload.filedownloadAction"> <!- 下载-> <result name="success" type="strea

22、m" > <param name="contentType">application/octet-stream</param><!- 文件类型(无限制) -> <param name="contentDisposition">attachment;filename="$getName()"</param><!- 使用经过转码的文件名作为下载文件名 默认格式是attachment;filename="$fileName",将调用该Act

23、ion中的getFileName方法。 -> <param name="inputName">downloadFile</param><!- inputName 流对象名 比如这里写inputStream,它就会自动去找Action中的getInputStream方法。 -> <param name="bufferSize">4096</param><!- bufferSize 下载文件的缓冲大小 -> </result> </action>Action

24、拦截到filedownlaod请求后,将请求参数传递给filedownaction处理。其中请求参数filename表示文件的名称,url文件在服务器磁盘的绝对路径。具体代码如下:private String filename;private String url;public String getName()byte b;try System.out.println("filename:"+filename);b = filename.getBytes();String s=new String(b,"ISO8859-1");return s; cat

25、ch (UnsupportedEncodingException e) System.out.println("错误!");e.printStackTrace();return filename;public String getFilename() return filename;public void setFilename(String filename) this.filename = filename;public InputStream getDownloadFile() try return (new FileInputStream(url); catch (

26、FileNotFoundException e) System.out.println("FileNotFound");e.printStackTrace();return null; public String execute() return SUCCESS; 图9 实现单个文件下载的Action类当用户点击下载,后会出现如图4所示的下载框。用户可选择文件存储位置以及修改文件名称,点击保存后,开始下载。如图5所示:图4 下载框图5 文件开始下载五、文件夹下载功能实现文件夹下载采用客户端方式实现,首先介绍服务器端的程序。用户在浏览器上点击下载,然后浏览器产生一个Folde

27、rZIP请求。Strtus2拦截到FolderZIP请求后将请求参数文件夹路径url、用户IP、文件夹名称name传递给SocketAction处理。拦截器配置文件如下所示: <action name="FolderZIP" class="TestSocket.FolderZIP"> <!- 文件夹 <result name="success"> /SocketSuccess.html </result> <result name="error"> /Socke

28、terror.jsp </result> </action>SocketAction在54321号端口建立Socket通信。成功连接客户端后发送通信数据包,通信数据传输、数据包结构如下所示:Socket client_Inf=new Socket(IP,54321);System.out.println("开始发送通信数据包.");client_Inf.getOutputStream();FileDownloadPackage filedownloadPackage=new FileDownloadPackage();filedownloadPack

29、age.Header="CreateFolder"filedownloadPackage.SourseIP=client_Inf.getLocalAddress().getHostAddress();filedownloadPackage.Port=client_Inf.getLocalPort();filedownloadPackage.Name=name;filedownloadPackage.Location=""filedownloadPackage.Blank="123"ObjectOutputStream oos=new

30、ObjectOutputStream(client_Inf.getOutputStream();oos.writeObject(filedownloadPackage);System.out.println("发送通信数据包成功.");oos.flush();r.delay(1000);oos.close();client_Inf.close();r.delay(2000);/* * 文件夹下载数据结构 */private static final long serialVersionUID = 1L;public String Header;/文件头CreateDirec

31、torFolder public String SourseIP;/发送方IPpublic int Port;/发送方端口public String Name;/文件夹名称public String Location;/需要创建的位置,j:/file 的后续位置 例如 Location=/g1public String Blank;/保留位客户端接收到通信数据包后解析,数据包内容,打开59999号端口准备接收文件。在下载之前需要进行文件夹大小计算,如果文件夹总大小大于等于3GB这停止递归调用,返回Size,当文件夹计算函数返回error,提示用户下载文件夹过大,建议分开下载。文件夹大小计算函数

32、如下所示: /* * 验证文件夹大小 */ FileSize fs=new FileSize(); fs.getsize(new File(url); if(fs.num>10000|fs.size>3000)/文件数目>10000 文件大小大于3G System.out.println("文件大小="+fs.size); System.out.println("文件个数="+fs.num); return "error" 如果计算文件大小小于3GB,服务器调用ZIP类,实现指定文件夹的压缩打包。ZIP类的主要方法为

33、遍历文件夹,将文件夹内的文件依次压缩。ZIP类代码如下:public class ZIP /*创建一个压缩文件,from为文件夹路径,to为创建好后压缩文件路径*/public void CreateZip(String from,OutputStream to) throws IOExceptionList<File>list=getFiles(from);ZipOutputStream out=new ZipOutputStream(to);for(File f:list)InputStream in=new FileInputStream(f);String name=get

34、RelName(from,f);ZipEntry en=new ZipEntry(new File(from).getName()+"/"+name);en.setSize(f.length();out.putNextEntry(en);out.setComment("中文测试");int len=0;bytebuffer=new byte1024;while(-1!=(len=in.read(buffer)out.write(buffer, 0, len);in.close();out.close();/*获取文件的相对路径*/private Stri

35、ng getRelName(String from,File f) / TODO Auto-generated method stubString a=f.getAbsolutePath().replace(from+"", "");a=a.replace("", "/");System.out.println(from+"-"+a);return a;/*获取路径下所有文件,包括文件夹下的*/private List<File> getFiles(String sou)List&l

36、t;File>list=new ArrayList<File>();File f=new File(sou);File files=f.listFiles();for(File file:files)if(file.isFile()list.add(file);elselist.addAll(getFiles(file.getPath();return list;文件成功压缩后存储于服务器的缓存中,服务器调用数据传输端口与客户端的59999号端口建立Socket链接,开始传输缓存里的压缩文件。实现代码如下所示:Socket client=new Socket(IP,defau

37、ltPort);System.out.println("下载链接创建成功!目标IP="+IP+" 目标端口="+defaultPort);FileInputStream fis=new FileInputStream("j:/file/java.zip");OutputStream netOut=client.getOutputStream();OutputStream out=new DataOutputStream(new BufferedOutputStream(netOut);byte buffer=new byte4096;

38、int num=fis.read(buffer);while(num!=(-1)out.write(buffer, 0, num);out.flush();num=fis.read(buffer);out.flush();out.close();fis.close();client.close();客户端程序采用多线程技术,在实现文件夹压缩下载功能时总共使用了3个线程main(String args)主线程、Information_Port通信数据端口监视线程、Server_Port数据传输线程、Progress下载进度监视线程。下面我将分别介绍四个线程的作用、代码实现。main(String

39、 args)主线程为程序主入口,主线程主要作用是创建、开启和关闭其他线程。所有的线程都在主线程里调用。主线程代码如下:public static void main(String args) throws AWTException UIDeCode uicode=new UIDeCode();uicode.lanchframe();UI ui=new UI("59999下载端口监视");ui.LanchFrame();Information_Port infp=new Information_Port(ui);Thread tinfp=new Thread(infp);ti

40、nfp.start();Server_Port sp=new Server_Port(ui,infp);Thread tsp=new Thread(sp);tsp.start();六、范围搜索功能实现(一)范围精确搜索功能实现范围精确搜索由两个函数实现,分别是search_file()搜索文件和search_d()搜索文件夹。函数的执行步奏主要是:1. 获取前端传来的请求参数,利用File file=new File()创建文件引用,然后利用listFile()函数获取文件列表。然后使用循环语句依次对文件明进行获取。如果文件名与所要搜索的文件名相同,这执行将文件名、文件路径、文件大小存入Ses

41、sion返回前台。2. 如果是文件夹则进行递归调用,即函数自己调用自己。关键代码如图所示:public void search_file(String url)/session.clear(); File file=new File(url);/创建文件 File List= file.listFiles();/将文件列表放入List数组 if(List=null)/判断是否为空文件夹或者文件不存在 System.out.println("空文件夹"); System.out.println("Robot chappe Complete!在"); els

42、e /System.out.println("该目录下对象个数:"+List.length); for(int i=0;i<List.length;i+) if(Listi.isFile() if(Listi.getName().equals(name)/比较文件名称与需要查询的名称 System.out.println("找到文件!"+Listi.getPath(); String p=Listi.getPath();/获取文件路径 String name= Listi.getName();/获取文件名称 session.put("fi

43、le"+k, p);/将文件路径存入Session session.put("filename"+k,name);/将文件名称存入Session session.put("filesize"+k, Listi.length()/1000000+"M"); k+; for(int i=0;i<List.length;i+) if(Listi.isDirectory() search_file(Listi.getPath();/递归调用! session.put("fileNumber", k);同理文

44、件夹的精确搜索实现代码如下:public void search_d(String url)int k=0; File file=new File(url); File List= file.listFiles(); if(List=null) System.out.println("空文件夹"); System.out.println("Robot chappe Complete!在"); else System.out.println("该目录下对象个数:"+List.length); for(int i=0;i<List.

45、length;i+) if(Listi.isFile() for(int i=0;i<List.length;i+) if(Listi.isDirectory() if(Listi.getName().equals(name) System.out.println("找到文件夹夹夹!"+Listi.getPath(); session.put("directory"+k, Listi.getPath(); session.put("directoryname"+k, Listi.getName(); session.put(&q

46、uot;directorysize"+k, Listi.length()/1000000+"M"); k+;search_d(Listi.getPath(); session.put("directoryNumber", k); (二)范围模糊搜索功能实现范围模糊搜索功能的实现,与范围精确搜索功能的实现大同小异。唯一的区别在于,文件夹名称的比较。只要文件夹中有搜索的关键字,则认为找到文件或者文件夹。关键代码如下: if(Listi.getName().indexOf(name)!=-1)/查找的字符串在文件名中 System.out.print

47、ln("找到文件!"+Listi.getPath(); String p=Listi.getPath(); String name= Listi.getName(); session.put("file"+k, p); session.put("filename"+k,name); session.put("filesize"+k, Listi.length()/1000000+"M"); k+; 七、快速搜索功能实现快速搜索采用建立数据库索引的方法。首先服务器运行索引建立程序。按着程序的默认设

48、置,索引每天更新一次,当晚上12点时程序自动运行。50万个文件的索引建立大约需要2小时。(1) 数据库结构数据库采用MySQL数据库。MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司开发,目前属于Oracle公司。MySQL是一种关联数据库管理系统,关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。MySQL所使用的SQL语言是用于访问数据库的最常用标准化语言。MySQL软件采用了双授权政策(本词条“授权政策”),它分为社区版和商业版,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发都选择MyS

49、QL作为网站数据库。数据库名称为qbzdfile用户名:dx密码:1026278249如图6所示:图6数据库整体结构文件和文件夹的Table结构相同,number为一个Int整数型自增主键,number代表文件的唯一编码。name是一个varchar类型代表文件的名称。url是一个varchar类型代表文件在服务器磁盘的绝对路径。size是一个varchar类型代表文件的大小。如图7所示:图7 文件和文件夹的Table(2) 服务器程序连接数据库实现导入mysql-connector-java-5.1.6-bin.jar文件到lib项目文件夹。利用JDBC技术实现Java服务器与数据库的连接。

50、JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序。Java数据库连接体系结构是用于Java应用程序连接数据库的标准方法。JDBC对Java程序员而言是API,对实现与数据库连接的服务提供商而言是接口模型。作为API,JDBC为程序开发提供标准的接口,并为数据库厂商及第三方中间件厂商实现与数据库的连接提供了标准方法。JDBC使用已有的SQL标准并支

51、持与其它数据库连接标准,如ODBC之间的桥接。JDBC实现了所有这些面向标准的目标并且具有简单、严格类型定义且高性能实现的接口。Java 具有坚固、安全、易于使用、易于理解和可从网络上自动下载等特性,是编写数据库应用程序的杰出语言。所需要的只是 Java应用程序与各种不同数据库之间进行对话的方法。而 JDBC 正是作为此种用途的机制。JDBC 扩展了 Java 的功能。例如,用 Java 和 JDBC API 可以发布含有 applet 的网页,而该 applet 使用的信息可能来自远程数据库。企业也可以用 JDBC 通过 Intranet 将所有职员连到一个或多个内部数据库中(即使这些职员所

52、用的计算机有 Windows、 Macintosh 和UNIX 等各种不同的操作系统)。随着越来越多的程序员开始使用Java编程语言,对从 Java 中便捷地访问数据库的要求也在日益增加。MIS管理员们都喜欢Java和JDBC的结合,因为它使信息传播变得容易和经济。企业可继续使用它们安装好的数据库,并能便捷地存取信息,即使这些信息是储存在不同数据库管理系统上。新程序的开发期很短。安装和版本控制将大为简化。程序员可只编写一遍应用程序或只更新一次,然后将它放到服务器上,随后任何人就都可得到最新版本的应用程序。对于商务上的销售信息服务, Java 和JDBC 可为外部客户提供获取信息更新的更好方法。

53、快速搜索也分为文件搜索和文件夹搜索。程序执行方式基本与范围搜索相同,只是在数据库的架构下执行。程序关键代码如下:public void saerch_file()try Class.forName("org.gjt.mm.mysql.Driver");Connection conn=DriverManager.getConnection("jdbc:mysql:"+ "/localhost:3306/qbzdfile?user=dx&password=1026278249");Statement stm=conn.create

54、Statement();ResultSet rs=stm.executeQuery("select * from file where name='"+name+"'");while(rs.next()String name=rs.getString("name");String size=rs.getString("size");String url=rs.getString("url");session.put("filename"+k, name);se

55、ssion.put("filesize"+k, size);session.put("file"+k, url);k+; catch (ClassNotFoundException | SQLException e) / TODO Auto-generated catch blocke.printStackTrace();session.put("fileNumber", k);public void saerch_d()try Class.forName("org.gjt.mm.mysql.Driver");Co

56、nnection conn=DriverManager.getConnection("jdbc:mysql:"+ "/localhost:3306/qbzdfile?user=dx&password=1026278249");Statement stm=conn.createStatement();ResultSet rs=stm.executeQuery("select * from d where name='"+name+"'");while(rs.next()String name=

57、rs.getString("name");String size=rs.getString("size");String url=rs.getString("url");session.put("directoryname"+k, name);session.put("directorysize"+k, size);session.put("directory"+k, url);k+; catch (ClassNotFoundException | SQLException e) / TODO Auto-generated catch blocke.printStackTrace();session.put("directoryNumber", k);八、客户端监听程序(云同步)客户端采用Socket编程,网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。Socket的英文原义是“孔”或“插座”。作为BSD UNIX的进程通信机制,取后一种意思。通常也称作"

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论