用struts2上传和下载文件代码

博客介绍了利用Struts2进行文件上传和下载的方法,下载部分涵盖jsp代码、struts2配置和java代码,还列举了下载时遇到的问题及解决办法,如方法调用、文件名动态修改、中文路径处理、下载速度和文件类型设置等;上传可使用easyui - filebox。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

利用struts做上传和下载文件很简单,省去了大量的代码,具体:

下载:

jsp代码

$("#downinfo").empty();
$("#downinfo").append("生成DOC成功,<a href='idc/report/downloadfilePath="+data.data+"&fileName="+data.filename+"'><span style='color:blue'>下载</span></a>");
						

struts2配置

<action name="download" class="idcFlowUploadFile" >
			<result  name="success" type="stream">  
			<!-- 下载的文件数据存放的方法,该方法返回一个InputStream   
			例如取值为inputStream的属性需要编写getInputStream()方法-->  
			<param name="inputName">downloadFile</param>  
			<!--下载时,客户端显示的下载的文件名 -->  
			<param name="contentDisposition"> attachment; filename=${fileName}</param>  
			<!-- 数据的缓冲大小 -->  
			<param name="bufferSize">1024</param>  
			</result>  
</action>

java代码

//x下载文件
public InputStream getDownloadFile() throws Exception{
		String file = filePath;
		downloadFile = new FileInputStream(new File(file));
		return downloadFile;
	}
public void setDownloadFile(InputStream downloadFile) {
		this.downloadFile = downloadFile;
	}
public String getFilePath() {
		return filePath;
	}
public void setFilePath(String filePath) throws UnsupportedEncodingException {
		this.filePath = new String(filePath.getBytes("iso8859-1"),"utf-8");
	}

遇到的问题:

1.action中没有method,不知道怎么调取方法

<!-- 下载的文件数据存放的方法,该方法返回一个InputStream   
            例如取值为inputStream的属性需要编写getInputStream()方法-->  
            <param name="inputName">downloadFile</param>  

只需要编写getDownLoadFile方法即可,接收一个流。

2.下载的文件名 修改成动态

<!--下载时,客户端显示的下载的文件名 -->  
            <param name="contentDisposition"> attachment; filename=${fileName}</param> 

只需要后台传一个fileName即可

3.下载路径中含有中文,下载失败

public void setFilePath(String filePath) throws UnsupportedEncodingException {
        this.filePath = new String(filePath.getBytes("iso8859-1"),"utf-8");
    }

在传入后台的路径中把路径设置成utf-8即可

4.下载慢

<!-- 数据的缓冲大小 -->  
            <param name="bufferSize">1024</param>  

根据文件大小的需要设置适当的缓冲大小。

5.设置下载的类型

<param name="contentType">${contentType}</param><!-- 下载的内容类型,如图片类型、文档类型等…… -->
  • <!--指定文件内容类型和互联网MIME标准中的规定类型一致,

  • 例如text/plain代表纯文本,text/xml表示XML,image/gif

  • 代表GIF图片,image/jpeg代表JPG图片 -->

  • 也可以不设置,不限制下载的文件类型

上传

可以用easyui-filebox

jsp

<tr>
	<td> 图片路径:</td>
	<td><input multiple style="width:300px" id="fileputHB1" name="fileputHB1"  class="easyui-filebox" data-options='onChange:change_photo1'>
    </td>
</tr>

 struts2

<action name="uploads" class="idcFlowUploadFile" method="uploads">

            <!-- 指定(限制)上传文件的类型,定义局部拦截器,修改默认拦截器的属性 
                "fileUpload.maximumSize" :限制上传最大的文件大小。 
                "fileUpload.allowedTypes":允许上传文件的类型。 
                "fileUpload.allowedExtensions":允许上传文件的可扩展文件类型。 -->
            <interceptor-ref name="defaultStack">
                <param name="fileUpload.maximumSize">500000000</param>
                <param name="fileUpload.allowedTypes"> image/bmp,image/png,image/gif,image/jpeg,image/jpg,image/x-png, image/pjpeg </param>
            </interceptor-ref>
  </action>

java

// 上传的图片存储在本地
	public String uploadFileByStrong(File file, String Rname, String dirname)
			throws IOException {
		if (!file.isFile()) {
			return "";
		}
		String filename = "";
		try {
			// 创建磁盘文件夹
			String path =  storagePath+ dirname;
			filename = UUID.randomUUID().toString() + "-" + Rname + ".png";
			File file1 = new File(path + "/" + filename);
			if (!file1.getParentFile().exists()) {
				file1.getParentFile().mkdirs();
			}
			FileInputStream in = new FileInputStream(file);
			FileOutputStream out = new FileOutputStream(file1);
			int n = 0;// 每次读取的字节长度
			byte[] bb = new byte[1024];// 存储每次读取的内容
			while ((n = in.read(bb)) != -1) {
				out.write(bb, 0, n);// 将读取的内容,写入到输出流当中
			}
			// 执行完以上后,磁盘下的该文件才完整,大小是实际大小
			out.close();// 关闭输入输出流
			in.close();
			return path+"/"+filename;
		} catch (Exception e) {
			// TODO: handle exception
			return "";
		}
	}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值