您的位置:首页 > 编程语言 > Java开发

java 文件的上传和下载的操作

2018-02-01 22:20 260 查看

文件上传

1.文件上传的技术
*JSPSmartUpload:在jsp页面使用代码进行文件上传,已经不用了。
*FileUpload:在java环境中实现文件上传,apache公司提供开发jar包
*Servlet3.0:在这个版本提供了文件上传功能。
*Struts2.0:在这个版本提供了文件上传功能。
2.文件上传的条件
* form表单必须是post提交方式。
* 使用<input type=”file” name=”xxx”/>;type必须是file类型,必须要有name属性值
* form表单必须使用enctype=”multipart/form-data”属性
3.文件上传的步骤
第一步:创建磁盘文件项工厂
第二步:创建核心上传类
第三步:使用核心上传类解析request对象 返回的List集合,集合里面有多个FileItem,List<FileItem>
第四步:遍历list集合,得到每个FileItem
第五步:判断是普通输入项还是文件上传项 boolean isFormField()
第六步:如果是普通输入项得到值;
如果是文件上传项编写上传的代码
getFieldName():得到普通输入项name的属性的值
getString():得到普通输入项里面输入的值
文件上传项
得到通过表单提交过了的文件的输入流,getInputStream()
创建输出流,把文件的输入流写到服务器的一个文件中

4.基本代码实现
`//创建磁盘文件项工程
DiskFileItemFactory factory=new DiskFileItemFactory();
//创建核心上传类
ServletFileUpload servletFileUpload=new ServletFileUpload(factory);
//解析请求
try {
List<FileItem > fileItems  = servletFileUpload.parseRequest(request);
//处理解析结果,遍历fileItems集合,判断是普通项还是文件上传项
for (FileItem fileItem : fileItems) {
if (fileItem.isFormField()) {
//是普通表单项
String name = fileItem.getFieldName();//获取表单项name值
String value = fileItem.getString("utf-8");//获取value值
System.out.println(name+"="+value);
}else{
//是文件上传项
String fileName = fileItem.getName();//获取文件名
//我们只需要a.txt
int index = fileName.lastIndexOf("\\");
if (index!=-1) {
//C:\Users\zxy\Desktop\a.txt是这种文件名
fileName=fileName.substring(index+1);
}
System.out.println("fileName="+fileName);
//生成唯一的用户名:
String newFileName = UploadUtils.getUUIDFileName(fileName);
//获取文件内容,文件内容可能是文本,如果是图片那就是流,总之获取输入流就行了。
InputStream iStream = fileItem.getInputStream();
//创建保存文件额路径
String path = getServletContext().getRealPath("/upload");
//获取文件该存放的子目录
String innerDirectory = UploadUtils.getDirectoryByHashCode(newFileName);
//String innerDirectory = UploadUtils.getDirectoryByDate();
//创建完整目录File对象
File saveDirectoryFile=new File(path+innerDirectory);
if (!saveDirectoryFile.exists()) {
saveDirectoryFile.mkdirs();
}
System.out.println(saveDirectoryFile);
//创建输出流,把文件写到服务器中
OutputStream oStream=new FileOutputStream(new File(saveDirectoryFile,newFileName));
//两个流对接
int len=-1;
byte[] buffer=new byte[1024];
while((len=iStream.read(buffer))!=-1){
oStream.write(buffer, 0, len);
}
iStream.close();
oStream.close();
}
}
} catch (FileUploadException e) {
e.printStackTrace();
}`
5.问题解决
1.文件同名问题(随机字符串唯一文件名解决)
2.同一文件夹文件过多问题(目录分离算法)

文件下载

文件下载的一个流二个头

一个流:资源文件的输入流
InputStream is1 = sc.getResourceAsStream("/download/美女.jpg");
二个头:
响应数据的类型
response.setHeader("Content-Type",mimeType );
设置浏览器打开方式
response.setHeader("Content-Disposition", "attachement;filename=美女.jpg");

----------------------------代码演示------------------------------------------------

package com.itheima.servlet;

import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import sun.misc.BASE64Encoder;

public class DownloadServlet extends HttpServlet {

private static final long serialVersionUID = 1L;

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

//获取文件名解决中文乱码
String filename = new String(request.getParameter("filename").getBytes("ISO8859-1"),"UTF-8");

//获取web项目下的资源文件
ServletContext sc = this.getServletContext();
InputStream is = sc.getResourceAsStream("/web/download/"+filename);

//设置content-type头
response.setHeader("Content-Type", sc.getMimeType(filename));

//获取客户端信息
String agent = request.getHeader("User-Agent");
//判断是火狐浏览器还是其他浏览器,对附件文件名进行编码
if(agent.contains("Firefox")){
//          filename = base64EncodeFileName(filename);
filename = new String(filename.getBytes("UTF-8"), "ISO8859-1");
}else{
filename = URLEncoder.encode(filename,"UTF-8");
}

//设置附件下载的头
response.setHeader("Content-Disposition", "attachment;filename="+filename);

//获取响应中的输出流
ServletOutputStream os = response.getOutputStream();
int len = 0 ;
byte[] bts = new byte[1024];
while((len =is.read(bts))!=-1){
os.write(bts, 0, len);
}

is.close();
}

public static String base64EncodeFileName(String fileName) {
BASE64Encoder base64Encoder = new BASE64Encoder();
try {
return "=?UTF-8?B?"
+ new String(base64Encoder.encode(fileName
.getBytes("UTF-8"))) + "?=";
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}

}

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: