一:文件当个上传例子
jsp页面代码:
- <form action="upload!oo" method="post" enctype="multipart/form-data">
- <s:fielderror></s:fielderror>
- 选择图片:<input type="file" name="upload"/><br/>
- <input type="submit" value="上传"/>
- </form>
Action代码:注意:jsp页面input传入过来的name值一定要对应action里面设置的三个属性值,设置上传的类型和上传文件名都必须以name值开头...
- //封装上传文件域的属性
- private File upload;
- //封装上传文件 类型 的属性
- private String uploadContentType;
- //封装上传文件 名 的属性
- private String uploadFileName;
action里面的方法...
- public String oo() throws Exception{
- //设置上传服务器的位置
- String root=ServletActionContext.getServletContext().getRealPath("/")+"p_w_picpath/";
- //设置输入流对象
- InputStream is=new FileInputStream(upload);
- //设置一个file对象
- File file=new File(root,uploadFileName);
- //设置一个输出流对象
- OutputStream os=new FileOutputStream(file);
- byte[] buff = new byte[1024];
- int length = 0;
- while (-1 != (length = is.read(buff))) {
- os.write(buff, 0, length);
- }
- return SUCCESS;
- }
然后看看struts.xml里面的配置
- <!-- 设置上传文件,使用拦截器 -->
- <interceptors>
- <interceptor name="myFileUpload"
- class="org.apache.struts2.interceptor.FileUploadInterceptor">
- <!-- 设置上传文件的最大值 -->
- <param name="maximumSize">9999999</param>
- <!-- 设置允许上传的格式 -->
- <param name="allowedTypes">p_w_picpath/png,p_w_picpath/gif,p_w_picpath/jpeg</param>
- </interceptor>
- </interceptors>
- <!-- 实现单个上传... -->
- <action name="upload" class="com.cxm.Action.upload">
- <!-- 引用拦截器 -->
- <interceptor-ref name="myFileUpload"></interceptor-ref>
- <interceptor-ref name="defaultStack"></interceptor-ref>
- <result name="success">/success.jsp</result>
- <result name="input">/index.jsp</result>
- </action>
还有一个国际化的问题,,,代码如下
- <!-- 引用国际化 -->
- <constant name="struts.custom.i18n.resources" value="fileUpload"></constant>
- 国际化资源文件代码如下
行了 ,,这样子 ,struts2的单个上传文件就OK啦。。代码简单撒...
好了,其实文件多上传下载给这个也是差不多的,只是在action里面接收的都弄成集合就行了,代码如下...
- private List<File> uploads;
- private List<String> uploadsFileName;
- private List<String> uploadsContentType;
- action的方法如下
- public String oo(){
- //设置上传服务器的位置
- String root=ServletActionContext.getServletContext().getRealPath("/")+"p_w_picpath/";
- for(int i=0;i<uploads.size();i++){
- // 设置输入流对象
- InputStream is = null;
- try {
- is = new FileInputStream(uploads.get(i));
- } catch (FileNotFoundException e) {
- e.printStackTrace();
- }
- //设置一个file对象
- File file=new File(root,uploadsFileName.get(i));
- //设置一个输出流对象
- OutputStream os = null;
- try {
- os = new FileOutputStream(file);
- } catch (FileNotFoundException e) {
- e.printStackTrace();
- }
- byte[] buff = new byte[1024];
- int length = 0;
- try {
- while (-1 != (length = is.read(buff))) {
- os.write(buff, 0, length);
- }
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- return SUCCESS;
- }
这样多上传就行了,特别注意的是,我在jsp里面弄了一个javascript的代码,javascript手动生成input表单,说白了就是想上传几个文件就点几下,我规定了最多可以同时上传五个..代码可以给大家看看,代码如下:
- <script language="javascript">
- var count= 0 ;
- var maxfile = 5;
- 增加元素
- function addUpload() {
- if(count >= maxfile) return;//限制最多maxfile个文件框
- count++;
- //自增id不同的HTML对象,并附加到容器最后
- var newDiv = "<div id=divUpload" + count +">"
- + " 选择图片:<input id=file" + count + " type=file size=50 name=uploads>"
- + " <a href=javascript:delUpload('divUpload" + count + "');>删除</a>"
- + " </div>";
- document.getElementById("uploadContent").insertAdjacentHTML("beforeEnd", newDiv);
- }
- //删除指定元素
- function delUpload(diva) {
- count--;
- document.getElementById(diva).parentNode.removeChild(document.getElementById(diva));
- }
- </script>
- </head>
- <body>
- <s:fielderror></s:fielderror>
- <form action="upload1!oo" method="post" enctype="multipart/form-data">
- <div id="uploadContent">
- <a href="addUpload()"< /span>>添加附件</a>
- </div>
- <input type="submit" value="多上传" />
- </form>
- </body>
这样子的多上传就可以了。。。其实struts2已经对这个上传下载进行了封装,对我们来说已经是比较简单的了...
sturts2的下载:
首先先把图片展示出来...
- <c:forEach var="fileName" items="${uploadsFileName}">
- <img alt="${fileName}" height="300px" width="150px" src="p_w_picpath/${fileName}">
- <a href="downLoad?fileName=${fileName}">下载图片</a>
- </c:forEach>
然后我们再看看struts.xml里面的配置
- <!-- 实现文件下载........ -->
- <action name="downLoad" class="com.cxm.Action.downLoad">
- <param name="inputPath">/p_w_picpath/${fileName}</param>
- <result name="success" type="stream">
- <!-- 指定文件的下载格式 -->
- <param name="contentType">p_w_picpath/jpeg</param>
- <!--p_w_upload加上下载的时候有保存框,filename文件名,contentDisposition内容地理位置 -->
- <!-- 指定下载的文件名 -->
- <param name="contentDisposition">p_w_upload;filename=${fileName}</param>
- <!-- 指定被下载的文件的文件名....给方法名一样,少get -->
- <param name="inputName">downloadFile</param>
- <!-- 指定下载文件时的缓冲大小 -->
- <param name="bufferSize">4096</param>
- </result>
- </action>
再看看action里面的方法。。。
- public InputStream getDownloadFile() throws Exception {
- System.out.println(fileName+"========"+"p_w_picpath/"+this.getFileName());
- InputStream is= ServletActionContext.getServletContext().getResourceAsStream("p_w_picpath/"+this.getFileName());
- System.out.println(is+"=====================>");
- return is;
- }
- public String execute() {
- return SUCCESS;
- }
getDownloadFile方法的目的是为了等到一个文件流,给struts2.xml里面的配置inputName的值是相关联的,去掉get,然后首字母小写,这样就差不多啦..千万要记住,在连接下载的时候千万不要指向这个方法,不然会包io转String的错...大家一定要记住了..
转载于:https://blog.51cto.com/00920508/1142209