文件上传与下载

一.获取服务器项目路径

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;

二.上传文件:文件放到服务器下

后端写接口

  1. servlet实现接口
  2. springmvc实现接口
  3. 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试试?

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值