程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> JavaWeb文件上傳下載功效深刻剖析(二)

JavaWeb文件上傳下載功效深刻剖析(二)

編輯:關於JAVA

JavaWeb文件上傳下載功效深刻剖析(二)。本站提示廣大學習愛好者:(JavaWeb文件上傳下載功效深刻剖析(二))文章只能為提供參考,不一定能成為您想要的結果。以下是JavaWeb文件上傳下載功效深刻剖析(二)正文


接著上一篇論述:

2、文件上傳與下載

Struts2開辟的三板斧,頁面jsp—設置裝備擺設文件struts2.xml—-還有舉措類Action

文件上傳條件:
form表單的method必需是post
form表單的enctype必需是multipart/form-data
供給type=”file”的上傳輸出域

Struts 對文件上傳的支撐的一些規矩

1、單文件上傳

開辟步調:

1)、在WEB-INF/lib下參加commons-fileupload-1.2.1.jar、commons-io-1.3.2.jar。這兩個文件可以從http://commons.apache.org/下載

2)、第二步:編寫upfile.jsp ,把form表的enctype設置為:“multipart/form-data“,以下:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<body>
  <s:actionerror/>
  <hr/>
  <s:fielderror></s:fielderror>
  <form action="${pageContext.request.contextPath}/upload1.action" method="post" enctype="multipart/form-data"><!-- 以MIME的方法傳遞
-->
    用戶名:<input type="text" name="username"/><br/>
    靓照:<input type="file" name="photo"/><br/>
    <input type="submit" value="上傳"/>
  </form>
 </body>

編寫毛病頁面error.jsp

 <body>
  辦事器忙,一會再試。
 </body>

success.jsp

 <body>
  上傳勝利
 </body>

3)、編寫UploadAction1 類:在Action類中添加屬性,屬性對應於表單中文件字段的稱號:

package com.itheima.actions;

import java.io.File;
import java.io.IOException;

import org.apache.commons.io.FileUtils;
import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;
//文件上傳:fileUpload攔阻器完成的
public class UploadAction1 extends ActionSupport {

  private String username;
  private File photo;//和表單的上傳字段名堅持分歧。類型是File類型的
  private String photoFileName;//上傳的文件名
  private String photoContentType;//上傳文件的MIME類型

  //省略getter和setter辦法
  public String upload(){
    System.out.println(photoFileName+":"+photoContentType);
    //通俗字段:
    System.out.println(username);
    //上傳字段:上傳到某個文件夾。存到運用的images目次下
    String realPath = ServletActionContext.getServletContext().getRealPath("/images");
    File directory = new File(realPath);
    if(!directory.exists()){
      directory.mkdirs();
    }
    try {
      FileUtils.copyFile(photo, new File(directory, photoFileName));
      return SUCCESS;
    } catch (IOException e) {
      e.printStackTrace();
      return ERROR;
    }

  }
}

在struts.xml文件中增長以下設置裝備擺設

<action name="upload1" class="com.itheima.actions.UploadAction1" method="upload">
  <interceptor-ref name="defaultStack">
    <param name="fileUpload.allowedTypes">image/jpeg,image/png</param>
    <param name="fileUpload.allowedExtensionsSet">jpg,jpeg,png</param>
  </interceptor-ref>
  <result>/success.jsp</result>
  <result name="error">/error.jsp</result>
  <result name="input">/index.jsp</result>
</action>

道理剖析:

a 、FileUpload 攔阻器擔任處置文件的上傳操作, 它是默許的 defaultStack 攔阻器棧的一員. 攔阻器有 3 個屬性可以設置.
 •maximumSize: 上傳文件的最年夜長度(以字節為單元), 默許值為 2 MB
 •allowedTypes: 許可上傳文件的類型, 各類型之間以逗號分隔
 •allowedExtensions: 許可上傳文件擴大名, 各擴大名之間以逗號分隔
可以在 struts.xml 文件中籠罩這 3 個屬性 

b、超越年夜小或不法文件的上傳,會報錯(轉向一個input的視圖)

經由過程:
<s:actionError/> <s:feildError/>顯示毛病新聞的提醒

c、毛病新聞提醒改成中文版:借助國際化的新聞資本文件

假如是經由過程設置裝備擺設全局默許參數惹起的毛病,最好用全局的新聞資本文件。
struts2默許的提醒資本文件:struts2-core-**.jar 的org.apache.struts2的struts-message.properties文件中。比著key值籠罩對應的value便可。

設置裝備擺設以下:

struts.messages.error.uploading=Error uploading: {0}
struts.messages.error.file.too.large=File too large: {0} "{1}" "{2}" {3}
struts.messages.error.content.type.not.allowed=Content-Type not allowed: {0} "{1}" "{2}" {3}
struts.messages.error.file.extension.not.allowed=File extension not allowed: {0} "{1}" "{2}" {3}

{0}:<input type=“file” name=“uploadImage”>中name屬性的值
{1}:上傳文件的真實稱號
{2}:上傳文件保留莅臨時目次的稱號
{3}:上傳文件的類型(對struts.messages.error.file.too.large是上傳文件的年夜小)

源碼:

修正顯示毛病的資本文件的信息

第一步:創立新的資本文件 例如fileuploadmessage.properties,放置在src下
           在該資本文件中增長以下信息
struts.messages.error.uploading=上傳毛病: {0}
struts.messages.error.file.too.large=上傳文件太年夜: {0} "{1}" "{2}" {3}
struts.messages.error.content.type.not.allowed=上傳文件的類型不許可: {0} "{1}" "{2}" {3}
struts.messages.error.file.extension.not.allowed=上傳文件的後綴名不許可: {0} "{1}" "{2}" {3}

 第二步:在struts.xml文件加載該資本文件

       <!-- 設置裝備擺設上傳文件的失足信息的資本文件 -->
       <constant name="struts.custom.i18n.resources" value=“cn….xxx.fileuploadmessage“/>

2、多文件上傳

上傳多個文件, 可使用數組或 List,其他和單文件上傳相似。

package com.itheima.actions;

import java.io.File;
import java.io.IOException;

import org.apache.commons.io.FileUtils;
import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;
//文件上傳:fileUpload攔阻器完成的
public class UploadAction2 extends ActionSupport {

  private String username;
  private File[] photo;//和表單的上傳字段名堅持分歧。類型是File類型的 .數組或List
  private String[] photoFileName;//上傳的文件名
  private String[] photoContentType;//上傳文件的MIME類型

  public String upload(){
    //上傳字段:上傳到某個文件夾。存到運用的images目次下
    String realPath = ServletActionContext.getServletContext().getRealPath("/images");
    File directory = new File(realPath);
    if(!directory.exists()){
      directory.mkdirs();
    }
    try {
      for(int i=0;i<photo.length;i++){
        FileUtils.copyFile(photo[i], new File(directory, photoFileName[i]));
      }
      return SUCCESS;
    } catch (IOException e) {
      e.printStackTrace();
      return ERROR;
    }

  }
}

3、文件下載

道理:struts2供給了stream成果類型,該成果類型就是專門用於支撐文件下載功效的
指定stream成果類型 須要指定一個 inputName參數,該參數指定一個輸出流,供給被下載文件的進口

編碼步調:
1)、舉措類DownloadAction :

package com.itheima.actions;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.net.URLEncoder;

import org.apache.commons.io.FilenameUtils;
import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;

public class DownloadAction extends ActionSupport {
  private InputStream image;//用in有成績的
  private String filename;//文件名
  private long filesize;
  public InputStream getImage() {
    return image;
  }

  public void setImage(InputStream image) {
    this.image = image;
  }

  public String getFilename() {
    return filename;
  }

  public long getFilesize() {
    return filesize;
  }

  public String download() throws Exception{
    //給image字撙節賦值
    String fileRealPath = ServletActionContext.getServletContext().getRealPath("/WEB-INF/classes/霉女.jpg");
    filename = FilenameUtils.getName(fileRealPath);
    //方法一:中文文件要停止URL編碼
//   filename = URLEncoder.encode(filename, "UTF-8");
    filesize = new File(fileRealPath).length();
    System.out.println(filename);
    image = new FileInputStream(fileRealPath);
    return SUCCESS;
  }
}

struts.xml設置裝備擺設文件:重要是對stream類型的成果停止設置裝備擺設

<struts>
  <constant name="struts.devMode" value="true" />
  <constant name="struts.ognl.allowStaticMethodAccess" value="true" />
    <action name="download" class="com.itheima.actions.DownloadAction" method="download">
      <result type="stream">

        <param name="inputName">image</param><!--舉措類中InputStream的字段名,須要在Action中供給getTargetFile辦法,前往inputStream-->
        <param name="contentType">application/octet-stream</param><!--告知閱讀器呼應頭,文件的MIME格局,挪用Action中的getContentType辦法-->
        <!-- 在struts.xml中應用OGNL表達式獲得舉措類中屬性的值。 挪用舉措類中的 getFilename()-->
        <!-- 中文文件名編碼:方法二.應用OGNL表達式,挪用URLEncode的靜態辦法 -->
        <!-- 默許OGNL挪用靜態辦法是不可的,須要開啟一個常量開關.struts.ognl.allowStaticMethodAccess=true -->
        <param name="contentDisposition">attachment;filename=${@java.net.URLEncoder@encode(filename,'UTF-8')}</param><!-- 告知閱讀器的下載方法-->
        <param name="contentLength">${filesize}</param>
      </result>
    </action>
  </package>
</struts>

攔阻器和文件上傳就寫到這裡了,好累,不外造詣感滿滿的。

以上就是本文的全體內容,願望對年夜家的進修有所贊助,也願望年夜家多多支撐。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved