首先,将我的数据文件导出到项目部署服务器的文件夹里,然后将该文件通过项目接口下载下来。
针对这个问题,展开思考
一、在本地测试的时候
1、使用文件流将文件从一个文件夹下载到另一个文件夹
2、假如文件路径fileUrl为 d://outputFiles/test.xlsx 下载到pathUrl d://temp/test.xlsx
代码如下
//文件所在位置
String fileUrl = "d://outputFiles/test.xlsx ";
//文件下载位置
String pathUrl = "d://temp/test.xlsx";
try {
URL url = new URL(fileUrl);
URLConnection conn = url.openConnection();
InputStream in = conn.getInputStream();
BufferedInputStream bis = new BufferedInputStream(in);
FileOutputStream out = new FileOutputStream(pathUrl );
BufferedOutputStream bos = new BufferedOutputStream(out);
byte[] buffer = new byte[4096];
int length = bis.read(buffer);
//保存文件
while(length != -1)
{
bos.write(buf, 0, length);
length = bis.read(buffer);
}
bos.close();
bis.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
3、用这种方式会报一个错
java.lang.RuntimeException: java.net.MalformedURLException: unknown protocol: d
at
说明访问本地文件需要个协议,只需要在fileUrl前加一个
"file:///"
即可下载成功
二、将项目部署到linux服务器上
1、文件应该是在服务器某个文件夹里,比如fileUrl = "/home/files/test.xlsx"
2、通过接口将文件下载到本地pathUrl = "d://temp/test.xlsx"
3、用以上代码,此时依旧使用 "file:///"协议,会发现我可以找到服务器上的文件,却找不到下载的路径,难道我下载的路径也是从服务器找的?
报错信息:
java.io.FileNotFoundException: d:/temp/test.xlsx (No such file or directory)
这里我还没找到解决方案
三、换一个方式下载服务器上的文件
1、这里用连接ssh的方式获取服务器上的文件,并下载到本地
代码如下
import java.io.*;
import ch.ethz.ssh2.Connection;
import ch.ethz.ssh2.Session;
import ch.ethz.ssh2.StreamGobbler;
public class TestRemoteConnect {
//
public static void main(String[] args) {
String path = "/home/files/test.xlsx";//Linux服务器中的文件路径
String hostName = "";//Linux服务器的地址
int port = 22;//SSH访问22端口
String username = "root";//Linux服务器的用户名
String password = "";//Linux服务器的密码
//创建SSH连接
Connection connect = getConnect(hostName, username, password, port);
//下载文件
downloadFile(path,"d:/temp/", connect);
}
/**
* 创建SSH连接
* @param hostName
* @param username
* @param password
* @param port
* @return
*/
public static Connection getConnect(String hostName, String username, String password, int port) {
Connection conn = new Connection(hostName, port);
try {
// 连接到主机
conn.connect();
// 使用用户名和密码校验
boolean isconn = conn.authenticateWithPassword(username, password);
if (!isconn) {
System.out.println("用户名称或者是密码不正确");
} else {
System.out.println("服务器连接成功.");
return conn;
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 下载文件
* @param path
* @param conn
*/
public static void downloadFile(String path,String filePath, Connection conn) {
if (conn != null) {
Session session = null;
try {
FileOutputStream fileOut = null;
session = conn.openSession();
//设置读取文件大小 102400
session.execCommand("tail -102400 ".concat(path));
InputStream inputStream = new StreamGobbler(session.getStdout());
BufferedInputStream bis = new BufferedInputStream(inputStream);
//写入到文件(注意文件保存路径的后面一定要加上文件的名称)
fileOut = new FileOutputStream(filePath);
BufferedOutputStream bos = new BufferedOutputStream(fileOut);
byte[] buf = new byte[4096];
int length = bis.read(buf);
//保存文件
while(length != -1)
{
bos.write(buf, 0, length);
length = bis.read(buf);
}
bos.close();
bis.close();
} catch (Exception e) {
e.printStackTrace();
} finally {
// 连接的Session和Connection对象都需要关闭
if (session != null) {
session.close();
}
if (conn != null) {
conn.close();
}
}
}
}
}
直接下载成功
四、将流传到前端下载
1、前端调用接口,配置{responseType: 'blob'}
2、下载代码,fileUrl是绝对路径
try {
// fileUrl是指想要下载的文件的路径
File file = new File(fileUrl);
if (!file.exists()) {
throw new RenException("文件不存在");
}
// 获取文件名
String fileName = file.getName();
fileName = URLEncoder.encode(fileName,"UTF-8");
response.setHeader("Content-disposition","attachment;filename="+ fileName);
FileInputStream fileInputStream = new FileInputStream(file);
IOUtils.copy(fileInputStream,response.getOutputStream());
response.flushBuffer();
fileInputStream.close();
} catch (IOException e) {
throw new RenException(e.toString());
}