其实文件的下载在前面的博客当中已经提到过了,但是本次单出一片博客的目的主要还是想把流程给理清楚,授人以鱼不如授人以渔对吧。
想要看文件上传的请跳转到前面一篇博文:
java实现文件上传到本地
那接下来我们来看看具体的实现步骤吧~
一、获取文件名和路径(由于前端传来的是一个文件,需要下载到本地,所以需要将获取到的文件先上传到本地)
二、设置响应格式
三、读取文件写入字节数组
四、读取文件写入响应对象
五、关闭流
好了,知道了大概的流程,那接下来就来看看具体的代码吧~~
public R downloadFile(HttpServletRequest request, HttpServletResponse response)throws IOException {// 1、获取文件路径和文件名String filePath = FilePath;String fileName = FileName;System.out.println("filePath:" + filePath + " fileName:" + fileName);// 2、设置响应头,指定下载文件的名称response.setHeader("Content-Disposition","attachment; filename=" + java.net.URLEncoder.encode(fileName, "UTF-8"));File file = new File(filePath);FileInputStream fileInputStream = new FileInputStream(file);try {// 3、读取文件内容到字节数组byte[] fileByte = new byte[(int) file.length()];ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();byte[] bytes = new byte[1024];int len;while ((len = fileInputStream.read(bytes, 0, bytes.length)) != -1) {byteArrayOutputStream.write(bytes, 0, len);}byteArrayOutputStream.close();fileByte = byteArrayOutputStream.toByteArray();// 4、将文件内容写入响应对象OutputStream outputStream = response.getOutputStream();outputStream.write(fileByte);outputStream.flush();// 5、关闭流fileInputStream.close();outputStream.close();// 返回成功信息return R.Success("文件下载成功");} catch (Exception e) {// 如果下载失败,返回失败信息e.printStackTrace();return R.Failed("文件下载失败");}}
FilePath和FileName是我定义的全局变量,前面通过另一个接口将文件上传到本地后把文件的名字(带后缀)和路径赋值给这两个全局变量。
R是我自定义的响应类,读者可以根据自己的项目情况做修改~