利用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 "";
}
}