java dtd文件下载-下载dtd文件
Java文件上传与下载 文件上传在web应用中很常见。 在jsp环境下实现文件上传功能是非常容易的,因为网上有很多用java开发的文件上传组件。 本文以commons-fileupload组件为例,为jsp应用添加文件上传功能。 功能 common-fileupload组件是Apache的开源项目之一。 它可以从 httpjakartaapacheorgcommonsfileupload 下载。 使用此组件,一次可以上传一个或多个文件,并且可以限制文件大小。 After downloading, decompress the zip package and copy commons-fileupload-10jar to the webapps of tomcat你的webappWEB-INFlib下目录不存在请自建目录新建一个servletUploadjava用于文件上传importjavaioimportjavautilimportjavaxservletimportjavaxservlethttpimportorgapachecommonsfileuploadpublicclassUploadextendsHttpServletprivateStringuploadPath"Cupload"上传文件的目录privateStringtempPath"Cuploadtmp "临时文件目录publicvoiddoPostHttpServletRequestrequestHttpServletResponseresponsethrowsIOExceptionServletException在doPost方法中当servlet收到浏览器发出的Post请求后实现文件上传以下是示例代码publicvoiddoPostHttpServletRequestrequestHttpServletResponseresponsethrowsIOExceptionServletExceptiontryDiskFileUploadfunewDiskFileUpload设置最大文件尺寸这里是4MBfusetSizeMax4194304设置缓冲区大小这里是4kbfusetSizeThreshold4096设置临时目录fusetRepositoryPathtempPath得到所有的文件ListfileItemsfuparseRequestrequestIteratorifileItemsiterator依次处理每个文件whileihasNe xtFileItemfiFileIteminext获取文件名这个文件名包含路径String fileName figetName可以在这里记录用户和文件信息并写入 e 到文件暂定文件名 atxt 可以从文件名中提取文件名 fiwritenewFileuploadPath "atxt" catchExceptione 可以跳转到错误页面 如果要在配置文件中设置 读取指定的上传文件夹,可以在文件夹中执行 public voidinitthrowsServletExceptionuploadPathtempPath初始化方法。 如果文件夹不存在,将自动创建。 如果没有-INFwebxml,新建典型配置如下mappingservlet-nameurlload -patternfileuploadurl-patternservlet-mappingweb-app 配置好servlet后,启动tomcat,写一个简单的html测试formaction"fileupload"method"post"enctype"multipartform-data"name"form1"inputtype"file"name"file" inputtype“submit” name “Submit” value “upload” form note action “fileupl oad” 其中 fileupload 是配置 servlet 时指定的 url-pattern。 下面是一个大虾的代码。 这个 Upload 比 smartUpload 更容易使用。 完全是我一个一个调试出来的。 它不像 smartUpload。 该bug多次调用方法UploadupnewUploadupinitrequest 这里可以调用setSaveDirString saveDir设置保存路径调用setMaxFileSizelongsize设置上传文件的最大字节调用setTagFileNameString设置上传文件的名称只对第一个文件有效然后uploadFile String[]namesupgetFileName 获取上传的文件名 文件的绝对路径应该是保存的目录 saveDir ""names[i] 可以通过upgetParameter"field"或者upgetParameterValues"filed"获取上传的文本来获取值of 同名字段比如多个checkBox 其他的自己试试源码用于传递 in request object instances privateStringboundary""memory data delimiter privateintlen0 every time from inside Actual read byte length privateStringqueryStringprivateintcount total number of uploaded files privateString[]fileName uploaded filename array privatelongm axFileSize1024102410最大文件上载字节privateStringtagFileName""publicfinalvoidinitHttpServletRequestrequestthrowsServletExceptionthisrequestrequestboundaryrequestgetContentTypesubstring30得到内存中数据分界符queryStringrequestgetQueryStringpublicStringgetParameterStrings用于得到指定字段的参数值重写requestgetParameterStringsifparameterisEmptyreturnnullreturnStringparametergetspublicString[]getParameterValuesStrings用于得到指定同名字段的参数数组重写requestgetParameterValuesStringsArrayListalnewArrayListifparameterisEmptyreturnnullEnumerationeparameterkeyswhileehasMoreElementsStringkeyStringenextElementif-1keyindexOfs""keyequalssaladdparametergetkeyifalsize0returnnullString[] valuenewString[alsize]forinti0ivaluelengthivalue[i]StringalgetireturnvaluepublicStringgetQueryStringre turnqueryStringpublicintgetCountreturncountpublicString[]getFileNamereturnfileNamepublicvoidsetMaxFileSizelongsizemaxFileSizesizepublicvoidsetTagFileNameStringfilenametagFileNamefilenamepublicvoidsetSaveDirStringsaveDir设置上载文件要保存的路径thissaveDirsaveDirFiletestdirnewFiles aveDir为了保证目录存在如果没有则新建该目录iftestdirexiststestdirmkdirspublicvoidsetCharsetStringcharset设置字符集thischarsetcharsetpublicbooleanuploadFilethrowsServletExceptionIOException用户调用的上载方法setCharsetrequestgetCharacterEncodingreturnuploadFilerequestgetInputStreamprivatebooleanuploadFileServletInputStreamservletinputstreamthrows取得央存数据的主方法ServletExceptionIOExceptionStringlinenullbyte[]buffernewbyte[256]whilelinereadLinebufferservletinputstreamcharsetnulliflinestartsWith" Content-Dispositionform-data"intilineindexOf"filename"ifi0如果分隔符的描述中有filename,表示是文件的编码内容StringfNamegetFileNamelineiffNameequals""continueifcount0tagFileNamelength0StringextfNamesubstringfNamelastI indexOf""1fNametagFileName""exttmpFileNameaddfNamecountwhilelinereadLinebufferservletinputstreamcharsetnulliflinelength2breakFilefnewFil
esaveDirfNameFileOutputStreamdosnewFileOutputStreamflongsize0lwhilelinereadLinebufferservletinputstreamnullnulliflineindexOfboundary-1breaksizelenifsizemaxFileSizethrownewIOException"文件超过"maxFileSize"字节"doswritebuffer0lendoscloseelse否则是字段编码的内容StringkeygetKeylineStringvalue""whilelinereadLinebufferservletinputstreamcharsetnulliflinelength2breakwhilelinereadLinebufferservletinputstreamcharsetnulliflineindexOfboundary-1breakvaluelineputkeyvaluetrimparameterifqueryStringnullString[]eachsplitqueryString""forintk0keachlengthkString[]nvspliteach[k]""ifnvlength2putnv[0]nv[1]parameterfileNamenewString[tmpFileNamesize ]forintk0kfileNamelengthkfileName[k]StringtmpFileNamegetk 将ArrayList中的临时文件名放入数据中供用户调用 iffileNamelength0return false 如果fileName数据为空则表示没有文件上传 同名KEY tryThreadcurrentThreadsleep1 为了不产生两个相同的keycatchExceptionekey ""SystemcurrentTimeMillishtputkeyvalue调用Servl etInputstrea同ms中的mreadLinebyte[]bintoffsetlength方法该方法是从ServletInputstream中读取一行到指定字节数组。 为了保证能容纳一行,byte[]b不能小于256。在重写的readLine中,调用了一个成员变量len来表示实际读取的字。 如果section数小于256java dtd文件下载,写入文件内容时应该从byte数组中写入len个字节的长度,而不是写入整个byte[]的长度。 但是,重写后的方法返回的是String,无法分析实际内容。 返回len,所以把len设置为一个成员变量,每次读操作时赋给它实际的长度,意味着在处理文件内容的时候,数据必须以String形式返回,分析开始和结束标签和at the same time in byte[ ]的形式写到文件输出流中privateStringreadLinebyte[]LinebyteServletInputStreamservletinputstreamStringcharsettrylenservletinputstreamreadLineLinebyte0Linebytelengthiflen-1returnnullifcharsetnullreturnnewStringLinebyte0lenelsereturnnewStringLinebyte0lencharsetcatchException_exreturnnullprivateStringgetFileNameStringline从描述字符串中分离出文件名iflinenullreturn""intilineindexOf"filename"linelinesubstringi9trimilinelastIndexOf""ifi0ilinelength-1ilinelastIndexOf""iflineequals""" "return""ifi0ilinelength-1returnlinereturnlinesubstringi1linelength -1 privateStringgetKeyStringline分隔字段名和描述字符串iflinenullreturn ""intilineindexOf"name"linelinesubstringi5trimreturnlinesubstring1linelength-1publicstaticString[]splitString strObStringmarkif strObnullreturnnullStringTokenizerstnewStringTokenizerstrObmarkArrayListtmpnewArrayListwhilesthasMoreTokenstmpaddstnextTokenString[]strArrnewString[tmpsize]forinti0itmpsizeistrArr[i]StringtmpgetireturnstrArr下载其实非常简单只要如下处理就不会发生问题publicvoiddownLoadStringfilePathHttpServletResponseresponsebooleanisOnLinethrowsExceptionFilefnewFilefilePathiffexistsresponsesendError404"Filenotfound"returnBufferedInputStreambrnewBufferedInputStreamnewFileInputStreamfbyte[]bufnewbyte[1024]intlen0responsereset非常重要ifisOnLine在线打开方式URLunewURL"file"filePathresponsesetContentTypeuopenConnectiongetContentTyperesponsesetHeader"Content - Disposition""inlinefilename"fgetName文件名应该编码成UTF-8else纯下载方式responsesetContentType"applicationx-msdownload"responsesetHeader"Content-Disposition""attachmentfilename"fgetNameOutputStreamoutresponsegetOutputStreamwhilelenbrreadbuf0outwritebuf0lenbrcloseoutclosejava实现文件下载一采用RequestDispatcher的方式进行1webxml文件中增加mime-mappingextensiondocextensionmime - typeapplicationvndms-wordmi me-typemime-mapping2程序如下 pagelanguage "java" import "javanet" pageEncoding "gb2312" response setContentType "applicationx-download" 设置为下载 applicationx-downloadStringfilenamedownload "system solution doc" 要下载的文件的相对路径 Stringfilenamedisplay "system solution doc" when downloading the file的文件保存名称filenamedisplayURLEncoderencodefilenamedisplay"UTF-8"responseaddHeader"Content-Disposition""attachmentfilename"filenamedisplaytryRequestDispatcherdispatcherapplicationgetRequestDispatcherfilenamedownloadifdispatchernulldispatcherforwardrequestresponseresponseflushBuffercatchExceptioneeprintStackTracefinally二采用文件流输出的方式下载1webxml文件中增加mime-mappingextensiondocextensionmime-typeapplicationvndms-wordmime-typemime -mapping2程序如下pagelanguage"java"contentType "applicationx-msdownload"import"javaiojavanet"pageEncoding"gb2312"关于下载文件时的文件流输出处理加上responsereset并且不换行 %包括最后一个是因为ApplicationServer在编译jsp的时候处理了%和%之间的内容,一般都是原样输出,默认是PrintWriter,但是你想流式输出ServletOutputStream。 这样做相当于试图在Servlet中使用两种输出机制java dtd文件下载,会出现getOutputStream has already been called for this response的错误。 详见本书第二部分《MoreJavaPitfill》Web层Item33试图在Servlet 270中使用两种输出机制,如果有换行,文本文件没有问题,但是对于其他格式如AutoCADWordExcel,下载的文件中会有一些换行符0x0d和0x0a,这可能会导致某些格式的文件失败。 open some也可以正常打开 responsereset 可以加也可以不加 responsesetContentType "applicationx-download" 设置为下载 applicationx-download 返回WEB-INFclasses 两级到应用的根目录下 注意下面这句获取的路径Tomcat and WebLogic is different in WebLogic路径最后没有SystemoutprintlnthisgetClassgetClassLoadergetResource""getPathStringfilenamedownloadthisgetClassgetClassLoadergetResource""getPath"系统解决方案doc"Stringfilenamedisplay"系统解决方案doc"系统解决方案txtfilenamedisplayURLEncoderencodefilenamedisplay"UTF-8"responseaddHeader"Content-Disposition""attachmentfilename"filenamedisplayOutputStreamoutputnullFileInputStreamfisnulltryoutputresponsegetOutputStreamfisnewFileInputStreamfilenamedownloadbyte[ ]bnewbyte[1024]inti0whileifisreadb0outputwriteb0ioutputflushcatchExceptioneSystemoutprintln“错误”eprintStackTracefinallyiffisnull