IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> 一文教你实现java中的文件上传下载 -> 正文阅读

[Java知识库]一文教你实现java中的文件上传下载

作者:recommend-item-box type_blog clearfix

引言:圈子大了什么鸟都有,刷到一个广告,加微信收费需求,前50名9.9扫码支付,支付完成推送会员名片,朋友圈全是价值精华,哦,原来这也是一个赚钱的点子,万物皆有需求,万物皆有价值,这条广告被我看到了,下次准备搞个java学习交流群,里面全是我这么多年工作中遇到的技术难点以及解决方案还有java学习路线。最主要的是我可以帮你搞定简历、课程设计、电商项目实战开发指导的需求。咱也不知道有没有人愿意付费,从今天起我准备我的人生就做2件事:从生活的问题出发,主动学习,并把学习的成功用于解决生活的问题,第二件事还没想好,想好再告诉大家。

1为什么写java中的文件上传下载解决方案

自从参加工作之后,我就存在一个问题,很多代码写了几百遍了,下次再想用的时候总是找不到,现在我每次开发完的功能都记录到博客上,特别是今天这篇java文件上传与下载功能特别值得记下来,方便下次使用。

2java中的文件上传下载技术大纲

看文章之前,还是老样子,请先看下面这张技术大纲图,大概了解这里面涉及到的技术与流程,坚持按照大纲看完文章你的思路会更清晰

3java中的文件上传下载技术解决方案

3.1案例展示

该功能前端界面支持,文件拖拽,和点击浏览进行选择文件上传至java后台服务器的数据目录中。

3.2前端HTML代码添加一个File组件

核心组件代码为:<input type="file" style="display:none" c1aaa="ignore-inlina-attach" id="attach-file-id" multiple=""
name="fileAttachment" remuired="" οnchange="displayFiles();">

3.3JS为HTML文档添加拖拽监听事件

JS元素中的:drop事件

3.4AJAX进行FormData文件上传

核心代码:FormData数据格式

var formData=new FormData();
var file=x.files[i];
formData.append('file',file);

3.5后台spring boot 接口 实现

需要注意:使用(@RequestParam(name = "file")MultipartFile file接收File类型的参数。

前端上传文件数据需要持久化至数据库。

最终文件上传需要留下记录所以需要插入审计日志。

@RequestMapping("/rest")
public class UploadRestApI {
private AttachmentFile attachmentFile;
@Autowired
  private AttachmentHelper attachmentHelper;
  @RequestMapping(value = "/uploadAttachment" ,method = RequestMethod.POST)
  @ResponseBody
  @CrossOrigin
  public  String uploadAttachment(@RequestParam(name = "file")MultipartFile file,@RequestParam("fileName") String fileNmae){

       System.out.println("附件上传程序开始");
      //1构建附件信息至数据库//1 网关.png image/png 附件ID  附件名称  附件类型

      //2持久化文件至磁盘目录
      attachmentHelper.createAttachment(UUID.randomUUID().toString(),attachmentFile);
      /****
       *3 插入审计日志
       * 什么人在什么时间段做了什么
       */
      //删除服务器附件测试
      //attachmentHelper.removeFile(attachmentId);

      return "sucess";
  }

3.6java中IO 流文件上传实现工具类技巧

 /***
附件上传工具类
*/
@Component  
public class AttachmentHelper {
private static final Logger log = LoggerFactory.getLogger(AttachmentHelper.class);
private static final String UPLOAD_ATTACHMENT_DIR = "/attachments";
/*** 
 输入流 
 输出到磁盘文件中 
 @param  attachmentId  
 @param  attachmentFile 
*/
public void createAttachment(String attachmentId, AttachmentFile attachmentFile) {
log.debug("Creating attachment in filesystem:" + attachmentId);
File f = new File(getSystemDataDirectory(), UPLOAD_ATTACHMENT_DIR);
if (!f.exists()) {
boolean success = f.mkdirs();
if (!success) {
log.error("unable to create attachement directory in" + getSystemDataDirectory());
log.error("Attachment creation failed");
return;
}
}
try {
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(new File(f, attachmentId.toString())));
InputStream inputStream = null;
if (attachmentFile.getFile() != null) {
inputStream = new FileInputStream(attachmentFile.getFile()); 
} catch (FileNotFoundException e) {
log.debug(e.getMessage(), e);
log.error("Unable to create file,attachment creation failed");
} catch (IOException e) { 
}
} 
} else {

     inputStream = attachmentFile.getInputFileStream();
 }
 BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);
 try {
     int inputData;
     while ((inputData = bufferedInputStream.read()) != -1) {
         bos.write(inputData);
     }
 } finally {
     if (attachmentFile.getFile() != null) {
         if (inputStream != null) {
             inputStream.close();
         }
         if (bufferedInputStream != null) {
             bufferedInputStream.close();
         }
     }
     if (bos != null) {
         bos.close();
     }

 }
     log.debug(e.getMessage(), e);
 log.error("Error writiong file content ,attachment creation failed");
     获取磁盘文件输入流内容 

 @param  attachmentId  
 @return  
*/
public BufferedInputStream getFileContent(Integer attachmentId) {
log.debug("Reading the file content with attachementId:" + attachmentId);
try {
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(new File(getSystemDataDirectory() + UPLOAD_ATTACHMENT_DIR + attachmentId.toString())));
return bis;
} catch (FileNotFoundException e) { 
} 
         
@param  attachementId 
*/
public void removeFile(Integer attachementId) {
log.debug("Removing file fromm filesystem with ttachmentId:" + attachementId);
//根据文件名称删除
File attachmentFile = new File(getSystemDataDirectory() + UPLOAD_ATTACHMENT_DIR + attachementId.toString());
if (attachmentFile.exists()) {
boolean result = attachmentFile.delete();
if (result) {
log.debug("File successfully deleted!");
} else {
log.warn("Failed to delete file with attachmentId" + attachementId);
}
}

}
/** 
获取应用系统数据目录

@return  
*/
private File getSystemDataDirectory() {
//可设置为Linux或者windows系统磁盘目录,目前设置为常量
File rootDir = new File("D:\");
return rootDir;
}
 
}
         

3.7文件实体类

public class AttachmentFile {
    private String name;

    private String mimeType;

    private File file;

    private InputStream inputFileStream;
    public AttachmentFile(){

    }
    public AttachmentFile(String name, String mimeType, File file) {
        this.name = name;
        this.mimeType = mimeType;
        this.file = file;
    }

    public AttachmentFile(String name, String mimeType, InputStream inputFileStream) {
        this.name = name;
        this.mimeType = mimeType;
        this.inputFileStream = inputFileStream;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getMimeType() {
        return mimeType;
    }

    public void setMimeType(String mimeType) {
        this.mimeType = mimeType;
    }

    public File getFile() {
        return file;
    }

    public void setFile(File file) {
        this.file = file;
    }

    public InputStream getInputFileStream() {
        return inputFileStream;
    }

    public void setInputFileStream(InputStream inputFileStream) {
        this.inputFileStream = inputFileStream;
    }
}

4结束语

最近时间有点紧,各种指导方案,各种问题,有点不知所措,忙过头了不是啥好事,一件事做到极致才是专家,足够专注做一件事,才牛逼!过2天给大家更新价值9999的面试宝典,以前都是收费的,现在决定把收费的价值全放出来。

5个人说明

全网唯一LRyab博客,经验是由一点一点积累的,思维也是由一天一天训练出来的。谢谢大家的阅读,原创不易,如果你认为文章对你有所帮助,就点个赞感谢大家支持,你的点赞是我持续写作的动力!

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-07-16 11:08:15  更:2021-07-16 11:10:48 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/7 21:26:04-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码