文件的下载与上传
一、文件下载
文件下载的例子在我们周围很常见,这里用java代码实现一个文件下载的例子。
1.想要下载某个文件,我们需要知道资源的路径。
//文件资源的地址
String path ="http://localhost:8080/hello/info.txt";
//将地址转化为url
URL url =new URL(path);
2.利用这个url打开一个远程链接,然后获取响应码。
//打开链接
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
//获得响应码
int code = connection.getResponseCode();
这里我们还可以设置range,来实现对文件部分下载的功能。如果设了range,我们在获取请求码时就不能用200,而应该用206.
connection.addRequestProperty("range", "bytes:-1000");
3.获取到响应码之后,开始读取数据,然后将数据写到本地
if(code == 206){
InputStream is = connection.getInputStream();
FileOutputStream fos =new FileOutputStream("info.txt");
int length=0;
byte[] buff=new byte[1024];
while((length=is.read(buff))!=-1){
fos.write(buff, 0, length);
}
is.close();
fos.close();
System.out.println("下载完成");
}
二、文件上传
这里我们采用apache fileupload第三方框架的方式将文件上传。
- 导入相应的架包。commons-fileupload-1.2.2.jar,commons-io-2.0.1.jar
构建磁盘文件工厂。
//1.构建磁盘文件工厂 DiskFileItemFactory factory =new DiskFileItemFactory();
通过文件工厂获取一个文件上传的核心类
//2.通过文件工厂获取一个文件上传的核心类 ServletFileUpload fileUpload =new ServletFileUpload(factory);
解析request,返回List
try { List<FileItem> fileItems = fileUpload.parseRequest(request); //循环取出每个fileItem for (FileItem fileItem : fileItems) { if(fileItem.isFormField()){ //是普通项 String fieldName =fileItem.getFieldName(); String name =fileItem.getString(); System.out.println(fieldName+" "+name); }else{ //文件上传项 String name =fileItem.getName();//文件名 InputStream is = fileItem.getInputStream(); FileOutputStream fos =new FileOutputStream("i:\\"+name); int length=0; byte[]buff=new byte[1024]; while((length=is.read(buff))!=-1){ fos.write(buff, 0, length); } is.close(); fos.close(); } }
这里我们就基本上将上传的功能完成了。然后我们还可以将功能完善一下。当上传的文件过大是,我们可以设置缓存。
//添加缓存 factory.setSizeThreshold(1024*1024); //获取绝对路径 String realPath =getServletContext().getRealPath("temp"); factory.setRepository(new File(realPath));
这里我们需要先在项目的工作区间里创建一个temp文件夹。然后我们还需要在关闭了流资源之后,将这些缓存文件删掉。
fileItem.delete();
最后还两个小问题,也是很重要的问题。
(1).个就是我们在将数据提交到servlet的时候,我们的表单必须是以post请求提交数据,而且还要添加一个属性enctype。<form action="/fileDown/MyServlet" method="post" enctype="multipart/form-data">
(2).如果文件名中有中文,我们不进行处理的话,就会出现乱码的问题,所以我们在得到核心类后进行编码设置。
fileUpload.setHeaderEncoding("UTF-8");
OK,搞定!