课件so easy系列之文件教程_第1页
课件so easy系列之文件教程_第2页
课件so easy系列之文件教程_第3页
课件so easy系列之文件教程_第4页
课件so easy系列之文件教程_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

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

文档简介

1、So Easy 系列之文件上传1. 文件上传概述1.1.文件上传所谓文件上传就是将本地文件上传到服务器端,从服务器端文件到本地的过程。例如目前需要上传头像、上传或网盘等功能都是利用文件上传功能实现的。文件上传实际上是两步操作,第一是文件上传,就是将本地文件上传到服务器端,实现文件多用户之间的共享,第二是文件,就是将服务器端的文件到本地磁盘。下面就文件上传与功能,分别学习。1.2. 文件上传实现原理首先,需要知道文件是如何实现上传及的。文件上传及实现原理如下:文件上传实现原理分析文件上传实现流程如下:客户端浏览器通过文件浏览框,选择需要上传的文件内容(其中包括文件路径及文件内容)。客户端浏览器通

2、过点击上传按钮,将本地文件上传到服务器端。服务器端通过程序接收本地文件内容,并将其保存在服务器端磁盘中。文件实现原理分析文件实现流程如下:客户端浏览器通过点击按钮,将服务器端保存的文件到本地磁盘。服务器端通过程序将服务器端文件响应给客户端。2. 文件上传实现2.1. 文件上传客户端页面实现在 Web 应用程序中实现文件上能,只需要在客户端页面中添加需要上传输入项,在服务器端 Servlet 中上传文件的数据,并保存在服务器端硬盘中即可。客户端浏览器页面实现文件上能,具体代码如下:需要注意的是:My JSP upload.jsp starting page文件描述:必须指定 name 属性值,否

3、则需要上传的文件数据是不会上传至服务器端。完成文件上能的表单的请求类型必须是T 方式。完成文件上能的表单的 enctype 属性值设置为“multipart/form-data”,该值的作用是将需要上传的文件数据添加到 Http 请求体中,并使用 MIME 协议对上传的文件进行描述。2.2. commons-fileupload 工具完成客户端的文件上能之后,主要是在服务器端完成接收上传文件的数据内容。为了方便实现文件上传逻辑,可以使用第提供的文件上传包,具体如下:jsp-smartupload.jar:使用 JSP 模型一时使用的,目前基本不再使用。commons-fileupload.ja

4、r:由 Apache提供的,用来实现 Java 环境下的文件上能。Servlet 3.0 规范中提供对文件上传的支持。commons-fileupload 组件的官网地址:mons-fileupload/。mons.apa需要注意的是:在使用 commons-fileupload 组件时,需要依赖于 commons-io 包。commons-fileupload组件工作流程如下:如何使用 commons-fileupload 组件实现文件上能,可以参考其官网的 User Guide 内容。创建 DiskFileItemFactory 文件项工厂对象。通过工厂对象获取文件上传请求类 Servle

5、tFileUpload。使用 ServletFileUpload 对应 Request 对象进行遍历每个 fileItem,判断是否为上传项。IOUtils.copy(inputStream,OutputStream)(将上传的数据拷贝到服务器的硬盘上的简单方法)具体实现代码如下:public claploadServlet extends HttpServlet publicresponse)dopublicresponse)void doGet(HttpServletRequest request, HttpServletResponsethrows ServletException, I

6、OException t(request, response);void dot(HttpServletRequest request, HttpServletResponsethrows ServletException, IOException / 创建DiskFileItemFactory文件项工厂对象DiskFileItemFactory factory = new DiskFileItemFactory();/ 通过工厂对象获取文件上传请求类ServletFileUploadServletFileUpload upload = new ServletFileUpload(factor

7、y);try / 使用ServletFileUpload对应Request对象进行List items = uplo/ 遍历每个fileItemarseRequest(request);for (FileItem fileItem : items) / 判断fileItem是否是上传项if (fileItem.isFormField() / 返回true:表示不是上传项String fieldName = fileItem.getFieldName(); String str = fileItem.getString(utf-8);System.out.prelseln(fieldName+

8、: +str);/ 返回false:表示是上传项String name InputStream= fileItem.getName();in = fileItem.getInputStream();String uploath =getServletContext().getRealPath(/upload);OutputStream out = newath, name);b;while (b = in.read() out.write(b);FileOutputStream(newFile(uplo!= -1) olose();in.close(); catch (FileUploadEx

9、ception e)e.prStackTrace();2.3. 动态多文件上传表单上述案例实现的是单文件上传,如果想实现多文件上能的话,服务器端的逻辑是一样的,也就是说,只需要在客户端页面实现多文件上传控件即可。动态实现多文件上传表单代码如下:2.4. 上传文件至 WEB-INF 目录到目前步骤,已经可以成功从客户端浏览器向服务器端上传文件。但是上传的路径存在一些问题,上述上传路径是自定义的文件夹,而上传至这种自定义的文件夹后,通过浏览器可以正常,这是非常的。例如一个用户上传一个 JSP 页面,然后通过浏览器该 JSP 页面,而该 JSP 页面中可以包含一My JSP upload.jsp s

10、tarting pagefunction add()/ 在div中添加上传输入项.geementById(uploaddiv).innerHTML += ;function del(obj)/ 传入obj 就是你点击 按钮对象var div = obj.parentNode; div.parentNode.removeChild(div);些代码。这时如果允许用户运行该 JSP 页面的话,可能会对服务器端造成很大影响。所以,通常情况下,会将上传目录创建在 Web 工程的 WEB-INF 目录下。因为该目录下的内容,是无法通过浏览器到的。获取文件上传路径的代码,应该修改为如下内容:2.5. 上传

11、文件名称的处理对于上传文件的名称,可能是文件的完整路径,例如:C:uploadaaa.jpg。在服务器端只需要保存其上传文件的名称即可,所以需要对上传文件的名称进行进一步地处理,具体处理代码如下:目前绝大多数的浏览器都不存在这个问题,仅仅只有一些比较老的浏览器版本存在,例如 IE6.0版本。为保证兼容浏览器产品,这个问题依旧需要解决。2.6. 上传文件中文乱码问题如果现在上传文件的名称为中文的话,会引起中文乱码问题。commons-fileupload 组件为解决中文乱码问题提供了两种解决方案,如下:利用 Request 对象的 setCharacterEncoding(“UTF-8”)方法,

12、该方法尽量编写在 Servlet 的 doGet()或 dot()方法的顶端。利用 ServletFileUpload 类提供的 setHeaderEncng(“UTF-8”)方法来解决。一般情况下,不关心上传文件的内容,因为上传文件会保存在服务器端的磁盘中。但是,如果需要在控制台打印上传文件的内容,而刚好该上传文件的内容中包含中文的话,可以使用 FileItem 的getString(“UTF-8”)来处理编码。2.7. 上传文件同名问题的处理如果同一个用户上传多个同名的文件,默认情况下会出现被覆盖的情况,即前一次上传的文件会String name = fileItem.getName();

13、/ 文件名可能是绝对路径,进行切割index = name.lastIndexOf();/ 获取之后的内容(真正的文件名)if(index = 0)name = name.substring(index + 1);String uploath = getServletContext().getRealPath(/WEB-INF/upload);被后一次上传的文件覆盖。而这种情况是不希望看到的,解决这个问题的方法就是可以为每一个上传的文件名称增加 UUID,因为 UUID 类的 randomUUID()可以生成一个唯一标识符。具体做法如下:2.8. 一个目录不能存放过多文件如果上传文件过多时,会

14、导致上传目录中的文件过多,内容过大。这时可以考虑将不同文件在不同的目录中,而生成不同目录的规则参考如下:按照上传时间进行目录分离,例如 2014-12-12 为一个目录。按照上传用户进行目录分离,为每一个用户创建一个上传目录。按照固定数量进行目录分离,设定当一个上传目录包含文件超过指定数量,创建新的上传目录。按照唯一文件名的 hashcode 进行目录分离。这里以 hashcode 进行目录分离方式为例演示,具体思路如下:使用 UUID 类的 randomUUID()方法生成唯一标识符。其值为 2dab369c-1e4f-4e58-8b61-13c7aef855b0。通过 hashCode()

15、方法获取其唯一标识符的 hashcode 值。其值为:166846237,转换成二进制后的值为:1100011101。按照每 4 位值“与”二进制 1111(F)后,生成一级目录。以此类推,每 4 位值“与”二进制 1111 后,生成一个级别的目录。根据上述步骤,可以编写一个按照 hashcode 方式生成目录的工具类,具体代码如下:/ 获得二级目录d2 = (hashcode 4) & 0 xf;/ 获得一级目录d1 = hashcode & 0 xf;hashcode = uuidFileName.hashCode();name = UUID.randomUUID().toString()

16、 + _ + name;/ 为上传文件名称增加UUID的前缀.name = UUID.randomUUID().toString() + _ + name;上述程序代码可以改写如下:2.9. 上个文件的大小限制上传文件时,用户可能上传非常大的文件,可能导致上传时占用过多资源。所以,对于用户上传的单个文件大小,应做出相应限制。利用 ServletFileUpload 的 setFileSizeMax(long)方法进行设置,其中参数表示设置的大小,为字节数,例如 servletFileUpload.setFileSizeMax(1024*10)表示上限为10KB。一旦上传的单个文件大小超过限制大

17、小时,会抛出 FileUploadBase.FileSizeLimitExceededException异常,可以捕获该异常后向页面输出相应的错误信息。具体实现代码如下:String randomDir = UploadUtils.generateRandomDir(name);String uploath = getServletContext().getRealPath(/WEB-INF/upload + randomDir);/ 生成随机目录new File(uploath).mkdir();d2 = (hashcode 4) & 0 xf;return / + d2 + / + d1;

18、public claploadUtils / 根据唯一文件名生成 hashcode目录分离算法public sic String generateRandomDir(String uuidFileName) / 获得唯一文件名的hashcodehashcode = uuidFileName.hashCode();/ 获得一级目录d1 = hashcode & 0 xf;/ 获得二级目录2.10. 上传文件的总大小的限制在实现多文件上传时,还需要设置上传文件的总大小。利用 ServletFileUpload 的 setSizeMax(long)方法进行设置,其中参数表示设置的大小,为字节数,例如

19、 servletFileUpload. setSizeMax(1024*10)表示上限为 10KB。一旦上传的文件大小超过限制大小时,会抛出 FileUploadBase.SizeLimitExceededException 异常, catch (FileUploadException e) if (e instanceof FileUploadBase.FileSizeLimitExceededException)/ 在request中保存错误信息request.setribute(msg, 上传失败!上传的文件超出了10KB!);/ 转发到index.jsp页面中!在index.jsp页面

20、中需要使用$msg来显示错误信息request.getRequestDispatcher(/index.jsp).forward(request, response);e.prStackTrace();public claploadServlet extends HttpServlet public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException dot(request, response);public void dot(Http

21、ServletRequest request, HttpServletResponse response) throws ServletException, IOException DiskFileItemFactory factory = new DiskFileItemFactory(); ServletFileUpload upload = new ServletFileUpload(factory);/ 设置单个上传文件的大小 upload.setFileSizeMax(1024 * 10); try List items = uploarseRequest(request);for

22、(FileItem fileItem : items) if (fileItem.isFormField() elseString name = fileItem.getName();in.close();可以捕获该异常后向页面输出相应的错误信息。具体实现代码如下:2.11. 文件缓存大小与临时目录一般情况下,上传文件默认都是先在内存中,然后在拷贝到服务器端的磁盘中。但是这样会有一些问题出现,例如单个文件过大时,占用服务器端资源会过多,导致服务器性能变差。这时可以通过手动设置文件缓存大小和上传文件的临时目录来解决。如果不设置上传的文件缓存大小,默认值if (e instanceof FileU

23、ploadBase.SizeLimitExceededException) / 在request中保存错误信息request.setribute(msg, 上传失败!上传的文件超出了10KB!);/ 转发到index.jsp页面中!在index.jsp页面中需要使用$msg来显示错误信息request.getRequestDispatcher(/index.jsp).forward(request, response);e.prStackTrace();public claploadServlet extends HttpServlet public void doGet(HttpServle

24、tRequest request, HttpServletResponse response) throws ServletException, IOException dot(request, response);public void dot(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException DiskFileItemFactory factory = new DiskFileItemFactory(); ServletFileUpload upload

25、 = new ServletFileUpload(factory);/ 设置单个上传文件的大小 upload.setSizeMax(1024 * 10); try List items = uploarseRequest(request);for (FileItem fileItem : items) if (fileItem.isFormField() elseString name = fileItem.getName();in.close(); catch (FileUploadException e) 为 10KB,其表示如果上传文件小于 10KB 的话,会先在服务器端的内存中,如果上

26、传文件大小大于 10KB 的话,会先在服务器端默认指定的临时目录中, 而上传文件的默认临时目录为System.getProperty(java.io.tmpdir)。手动修改上传文件缓存大小及临时目录的方式如下:手动修改上传文件缓存大小:DiskFileItemFactory.setSizeThreshold(缓存字节数);手动修改上传文件临时目录:itory(new File(getServletContext().getRealPath( 临时目录相对路DiskFileItemFactory.setRe径);具体实现代码如下:ServletFileUpload upload = new S

27、ervletFileUpload(factory);try List items = uploarseRequest(request);for (FileItem fileItem : items) if (fileItem.isFormField() elseString name = fileItem.getName();in.close(); catch (FileUploadException e) e.prStackTrace();public claploadServlet extends HttpServlet public void doGet(HttpServletReque

28、st request, HttpServletResponse response) throws ServletException, IOException dot(request, response);public void dot(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException DiskFileItemFactory factory = new DiskFileItemFactory();/ 内存缓冲区factory.setSizeThreshold

29、(3 * 1024 * 1024); / 3M/ 临时文件位置File reitory = newFile(getServletContext().getRealPath(/tmp); factory.setReitory(reitory);想要删除临时目录下的临时文件的话,只需要调用 FileItem 的 delete()方法即可。2.12. 文件上传进度器目前大部分具有文件上能的,在文件上传过程中,可以实时看到上传进度。可以使用ServletFileUpload 提供的 setProgressListener()方法实现,在客户端配置 Ajax 技术即可实现。由于目前没有掌握 Ajax 异

30、步交互技术,所以只能在服务器端完成查看进度功能。其中除使用 setProgressListener()方法实现外,还需要计算如下几个结果:已用时间:当前时间 开始时间/ 已用时间 已经上传大小速度:已经上传大小剩余大小:总大小 剩余时间:剩余大小/ 速度根据上述内容,具体查看上传进度功能如下:/ 获取上传文件的开始时间final long start = System.currentTimeMillis();/ 为文件上传对象,帮助查看进度器upload.setProgressListener(new ProgressListener() /*updaong pBytesRead, long

31、pContentLength,pItems)* 该方法用于获取文件上传过程相关数据内容.* 参数pBytesRead:到目前为止已经字节总数(已上传大小)* 参数pContentLength:正在上传字节总数 (文件大小)* 参数pItems:当前上传文件,是表单的第几个元素*/3. 文件实现3.1. 实现文件实现文件上能后,需要做的就是文件功能。文件不需要第组件支持,自定义完成即可,具体操作步骤如下:创建一个 JSP 页面用于显示文件列表。public void updaong pBytesRead, long pContentLength,pItems)if(pBytesRead = 0)

32、/ 刚开始上传,还没有数据return;/ 计算已经使用时间long hasUseTime = System.currentTimeMillis() - start;/ 计算上传速度double speed = (double)pBytesRead) / hasUseTime;/ 计算剩余大小long restBytes = pContentLength - pBytesRead;/ 计算剩余时间long restTime = (long) (restBytes / speed);System.out.prln(已用时间: + hasUseTime + , 传输速度: + speed + ,

33、剩余时间: + restTime);try Thread.sleep(1); catch (erruptedException e) e.prStackTrace(););创建一个 Servlet 用于文件功能。配置 Web 工程的 web.xml 文件。public class DownloadServlet extends HttpServlet public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException / 获取文件名Str

34、ing filename = request.getParameter(filename);/ 判断文件是否存在String path = getServletContext().getRealPath(/tmp); File file = new File(path, filename);if (file.isFile() & file.exists() / 说明文件存在/ 为设置ContentType和Content-Disitionresponse.setContentType(getServletContext().getMimeType(filename); response.set

35、Header(Content-Disition,attaent;filename=+filename);/文件的内容,写到客户端InputStream in = new BufferedInputStream(new FileInputStream(file);IOUtils.copy(in, response.getOutputStream(); in.close();public void dot(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException do

36、Get(request, response);My JSP download.jsp starting page1.jpg2.rar3.txt3.2. 中文乱码解决文件功能实现后,还需要解决中文乱码问题。由于页面中的文件名是使用 GET 方式提交请求的,所以可以使用如下代码解决:而上述代码只能解决服务器端接收客户端请求时参数的中文乱码问题,但是点击文件时的文件名称依旧是乱码的。这个问题是由于浏览器本身,不同浏览器的解决方式不同:IE 浏览器:使用 URL 编码。其他浏览器,使用 BASE64 编码。可以通过 Http 请求协议的请求头中的“User-Agent”内容,判断客户端当前使用的浏览器

37、是哪个产品。BASE64Encoder base64Encoder = new BASE64Encoder(); filename = =?utf-8?B? + base64Encoder.encode(filename.getBytes(utf-8) + ?=;filename = URLEncoder.encode(filename, utf-8); filename = filename.replace(+, );filename = new String(filename.getBytes(ISO-8859-1),UTF-8);DownloadServletapp.java.servl

38、et.DownloadServletDownloadServlet/download4. 文件上传案例通过网盘案例实现文件上传和功能,并且将文件上传相关信息保存到数据库表中。该案例实现原理分析如下:数据库建表语句如下:创建一个 JSP 页面用于网盘案例的主页面(提供文件上能和文件列表功能)。CREATE TABLE resour(idPRIMARY KEY AUTO_INCREMENT, uuidname VARCHAR(100) UNIQUE NOT NULL, realname VARCHAR(40) NOT NULL, savepath VARCHAR(100) NOT NULL,upl

39、oadtime TIMEST, desscription VARCHAR(255);String agent = request.getHeader(User-Agent);if(agent.contains(MSIE)/ IE浏览器,使用URL编码else/ 其他浏览器,使用BASE64编码4.1. 文件上能首先实现网盘中的文件上能,具体实现步骤如下:创建一个 JSP 页面用于文件上能。My JSP upload.jsp starting page文件上传文件上传文件描述My JSP index.jsp starting page文件上传综合系统文件上传文件创建一个 Servlet 用于处理

40、文件上能。public claploadServlet extends HttpServlet public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException /if判断form是否为上传表单 (!ServletFileUpload.isMultipartContent(request) throw new RuntimeException(该请求不是有效编码方式!);/定义与数据库关联对象Resource resource = ne

41、w Resource();/ 创建文件项工厂DiskFileItemFactory diskFileItemFactory = newDiskFileItemFactory();/ 创建器ServletFileUpload fileUpload = new ServletFileUpload( diskFileItemFactory);/ 处理上传文件名乱码fileUpload.setHeaderEncoding(utf-8);/try 请求requestList fileItems = fileUplo/ 遍历每个FileItemfor (FileItem fileItem : fileIt

42、ems) / 判断fileItem是否为文件上传if (fileItem.isFormField() / 不是上传项arseRequest(request);String name = fileItem.getFieldName();/ 处理乱码String value = fileItem.getString(utf-8);if (name.equals(description) resouretDescription(value); else / 是上传项/ 判断用户有没有上传String filename = fileItem.getName();if(filename = null |

43、 filename.trim().length()throw new RuntimeException(必须要上传文件!);=0)/上传文件名中是否包含 文件路径index = filename.lastIndexOf(); (index != -1) filename = filename.substring(index + 1);if/控制文件名唯一String uuidname = UploadUtils.generateUUIDFilename(filename);/ 生成hashcode 分散目录String randomDir = UploadUtils.generateRando

44、mDir(uuidname);/ 创建随机目录String savepath = /WEB-INF/upload + randomDir; File dirFile = newFile(getServletContext().getRealPath(savepath);dirFile.mkdirs();/ 上传文件内容InputStream in = newBufferedInputStream(fileItem.getInputStream();OutputStream out = new BufferedOutputStream(new FileOutputStream(new File(

45、dirFile, uuidname);b;while (b = in.read() != -1) out.write(b);in.close();olose();/ 删除临时文件,默认内存区 10KfileItem.delete();/ 准备 resour resour resour数据库信息 etUuidname(uuidname); etRealname(filename); etSavepath(savepath); catch (FileUploadException e) e.prStackTrace();throw new RuntimeException(文件上传失败!);/ 将

46、文件相关内容保存数据库QueryRunner queryRunner = newQueryRunner(JDBCUtils.getDataSource();String sql = inserto resourvalues(null,?,?,?,null,?);配置 Web 工程的 web.xml 文件。创建 UploadUtils 工具类用于封装文件上传依赖逻辑。UploadServletapp.java.servlet.UploadServletUploadServlet/uploadindex.jspObject args = resource.getUuidname(), resour

47、ce.getRealname(), resource.getSavepath(), resource.getDescription() ;try queryRunner.update(sql, args); catch (SQLException e) e.prStackTrace();throw new RuntimeException(将文件信息存入数据库失败!);/ 提示用户文件上传成功 response.setContentType(text/html;charset=utf-8); response.getWriter().prln(文件上传成功!);public void dot(

48、HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException doGet(request, response);创建一个 JavaBean 用于封装保存数据库相关信息。/ 二级目录d2 = (hashcode 4) & 0 xf;return / + d1 + / + d2;/* 根据真实文件名 生成uuidname*/public sic String generateUUIDFilename(String filename) String uuid = UUID.

49、randomUUID().toString();/ 不想保留源文件名 保留源文件扩展名String ext = filename.substring(filename.lastIndexOf(.);return uuid + ext;public claploadUtils /* 根据唯一文件名,生成随机目录*/public sic String generateRandomDir(String uuidname) hashcode = uuidname.hashCode();/ 一级目录d1 = hashcode & 0 xf;return uploadtime;public void se

50、tUploadtime(Timestuploadtime) this.uploadtime = uploadtime;public String getDescription() return description;public void setDescription(String description) this.description = description;public class Resource privateid;private String uuidname; private String realname; private String savepath; privat

51、e Timestuploadtime; private String description; publicgetId() return id;public void setId(id) this.id = id;public String getUuidname() return uuidname;public void setUuidname(String uuidname) this.uuidname = uuidname;public String getRealname() return realname;public void setRealname(String realname

52、) this.realname = realname;public String getSavepath() return savepath;public void setSavepath(String savepath) this.savepath = savepath;public TimestgetUploadtime() 4.2. 文件功能然后实现文件功能,具体实现步骤如下:创建一个 Servlet 用于显示文件列表。配置 Web 工程的 web.xml 文件。web-app ver=2.5xmlns=h/xml/ns/javaeepublic class ListServlet ex

53、tends HttpServlet public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException QueryRunner queryRunner = newQueryRunner(JDBCUtils.getDataSource();String sql = select * from resourorder by uploadtime desc;try List resour= queryRunner.query(sql,new B

54、eanLisndler(Resource.class); request.setribute(resour, resour);request.getRequestDispatcher(/download.jsp).forward(request, response); catch (SQLException e) e.prStackTrace();throw new RuntimeException(查询资源失败!);public void dot(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException doGet(request, response);创建一个 JSP 页面用于显示文件列表。创建一个 Servlet 用于文件功能。My JSP download.jsp starting page文件资源列表无任何资源资源名称:$resource.realname 上传时间:$r

温馨提示

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

最新文档

评论

0/150

提交评论