引言:圈子大了什么鸟都有,刷到一个广告,加微信收费需求,前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博客,经验是由一点一点积累的,思维也是由一天一天训练出来的。谢谢大家的阅读,原创不易,如果你认为文章对你有所帮助,就点个赞感谢大家支持,你的点赞是我持续写作的动力!
|