一.获取服务器项目路径
1.servlet、springmvc、springboot
获取项目路径:request.getServletContext()
获取项目下文件夹路径:
//通过getRealPath获取上传文件夹,如果项目在e:/project/j2ee/web,那么就会自动获取到 e:/project/j2ee/web/uploaded
String photoFolder = request.getServletContext().getRealPath("uploaded");
String photoFolder = req.getServletContext().getRealPath("")+"file"+File.separator+"uploaded"+File.separator+fileName;
二.上传文件:文件放到服务器下
后端写接口
- servlet实现接口
- springmvc实现接口
- springboot实现接口
前端调接口
一.前端上传文件:调接口的方式
或者直接上传到oss:https://blog.csdn.net/weixin_45879810/article/details/117108821
二.postman的方式
三.http请求调接口方式上传文件
Hutool上传文本和文件
hutool相对来说还是个不错的工具包,相比自己来写或者使用一些其他已有的工具包要简便很多,这里简单记录下利用hutool同时上传文本和文件。
1、包含单个文件
HttpResponse response = HttpRequest.post(url)
.form("param", "test")
.form("key", new File("C:\\Users\\12043\\Desktop\\cat.jpeg"))
.execute();
2、多个文件
File f1 = new File("C:\\Users\\12043\\Desktop\\cat.jpeg");
File f2 = new File("C:\\Users\\12043\\Desktop\\cat.jpeg");
HttpResponse response = HttpRequest.post(url)
.form("param", "test")
.form("key", f1,f2)
.execute();
也可以传入File数组
File f1 = new File("C:\\Users\\12043\\Desktop\\cat.jpeg");
File f2 = new File("C:\\Users\\12043\\Desktop\\cat.jpeg");
File[] files = new File[2];
files[0] = f1;
files[1] = f2;
HttpResponse response = HttpRequest.post(url)
.form("param", "test")
.form("key", files)
.execute();
后端上传文件
一.上传到服务器
1.获取待上传的文件夹目录
2.创建文件
3.写入文件
writer.append(qrcodeUrls.get(j));
// 写入到缓冲区
writer.append("\r\n"); // 换行
4.关闭流
例子:
public static void main(String[] args) {
File f = new File("a.txt");
FileOutputStream fop = new FileOutputStream(f);
// 构建FileOutputStream对象,文件不存在会自动新建
OutputStreamWriter writer = new OutputStreamWriter(fop, "UTF-8");
// 构建OutputStreamWriter对象,参数可以指定编码,默认为操作系统默认编码,windows上是gbk
writer.append("中文输入");
// 写入到缓冲区
writer.append("\r\n");
// 换行
writer.append("English");
// 刷新缓存冲,写入到文件,如果下面已经没有写入的内容了,直接close也会写入
writer.close();
// 关闭写入流,同时会把缓冲区内容写入文件,所以上面的注释掉
fop.close();
// 关闭输出流,释放系统资源
}
优化
File f = new File("F:/user/abc.txt");
try(FileWriter fop = new FileWriter(f);) {
// 写入到缓冲区
fop.append("中文输入");
// 换行
fop.append("\r\n");
fop.append("English");
} catch (IOException e) {
e.printStackTrace();
}
二.上传到oss
三.下载文件
1.servlet下载
@RequestMapping(value="/download")
public void download(HttpServletResponse response, HttpServletRequest request, @RequestParam("filename") String filename) throws IOException {
String path = request.getServletContext().getRealPath("/images");
// 1.构建File
File file = new File(path + File.separator + filename);
//response.setHeader("content-type", "image/png"); 不用设置
//response.setContentType("application/octet-stream"); 不用设置
// 2.设置Content-Disposition,必须设置
response.setHeader("Content-Disposition", "attachment;filename=122.jpg"); //可自定义名称
try (
//3.输出流
OutputStream out = response.getOutputStream();
//4.输入流
InputStream in =new FileInputStream(file);
){
//5.输出文件
int b;
while((b=in.read())!=-1){
out.write(b);
}
} catch (IOException e) {
e.printStackTrace();
}
}
2.springmvc下载
@RequestMapping(value="/download")
public ResponseEntity<byte[]> download(HttpServletRequest request, @RequestParam("filename") String filename, @RequestHeader("User-Agent") String userAgent) throws IOException {
// 下载文件的路径
String path = request.getServletContext().getRealPath("/images");
// 构建File
File file = new File(path + File.separator + filename);
// ok表示http请求中状态码200
BodyBuilder builder = ResponseEntity.ok();
// 内容长度
builder.contentLength(file.length());
// application/octet-stream 二进制数据流(最常见的文件下载)
builder.contentType(MediaType.APPLICATION_OCTET_STREAM);
// 使用URLEncoding.decode对文件名进行解码
filename = URLEncoder.encode(filename, "UTF-8");
// 根据浏览器类型,决定处理方式
if (userAgent.indexOf("MSIE") > 0) {
builder.header("Content-Disposition", "attachment; filename=" + filename);
} else {
builder.header("Content-Disposition", "attacher; filename*=UTF-8''" + filename);
}
return builder.body(FileUtils.readFileToByteArray(file));
}
3.springboot下载,同springmvc
四.io
创建文件夹:https://blog.csdn.net/m0_37989184/article/details/93025734
File testFile = new File(realPath + fileName);
File fileParent = testFile.getParentFile();
String fileParentPath = testFile.getParent();
if (!fileParent.exists()) {
fileParent.mkdirs();
}
创建文件
testFile.createNewFile();
4.远程图片地址实现上传:java url转file java网络URL资源转File文件流
public static File urlToFile(URL url) {
try {
URLConnection urlConn = urlConn = url.openConnection();
InputStream is = urlConn.getInputStream();
File file = File.createTempFile("tmp", null);
FileOutputStream fos = new FileOutputStream(file);
byte[] buffer = new byte[4096];
int length;
while ((length = is.read(buffer)) > 0) {
fos.write(buffer, 0, length);
}
is.close();
fos.close();
return file;
} catch (IOException e) {
return null;
}
}
五.优化
1 如果是采用的原生流的方式,使用缓存流或者nio试试?