fileSystem added
This commit is contained in:
parent
0511bfb79c
commit
575a64b4f6
@ -0,0 +1,192 @@
|
||||
package com.codesdream.ase.component.activity;
|
||||
|
||||
import com.codesdream.ase.exception.conflict.FileNameConflict;
|
||||
import com.codesdream.ase.exception.notfound.AppendixFileNotFoundException;
|
||||
import com.codesdream.ase.model.activity.Activity;
|
||||
import com.codesdream.ase.model.activity.AppendixFile;
|
||||
import com.codesdream.ase.repository.activity.ActivityRepository;
|
||||
import com.codesdream.ase.service.AppendixFileService;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.io.*;
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.Arrays;
|
||||
import java.util.LinkedList;
|
||||
import java.util.Optional;
|
||||
|
||||
@Component
|
||||
public class FileSystem {
|
||||
|
||||
@Resource
|
||||
private AppendixFileService appendixFileService;
|
||||
|
||||
|
||||
public static final int FAILED = -1;
|
||||
|
||||
//默认文件系统根路径
|
||||
private static final String rootDir = "d:/temp";
|
||||
|
||||
/**
|
||||
* 用于创建文件条目的辅助函数
|
||||
* @param fileName 文件名
|
||||
* @return 文件在数据库中的条目
|
||||
*/
|
||||
private AppendixFile createFileTable(String fileName)
|
||||
{
|
||||
AppendixFile appendixFile = new AppendixFile();
|
||||
appendixFile.setFileName(fileName);
|
||||
appendixFile.setLastEditTime(LocalDateTime.now());
|
||||
String[] temp = fileName.split("\\.",2);
|
||||
for(String s : temp)
|
||||
System.out.println(s);
|
||||
if(temp.length == 1)
|
||||
appendixFile.setType("");
|
||||
else
|
||||
appendixFile.setType(temp[temp.length-1]);
|
||||
return appendixFile;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 向磁盘中添加一个文件,并在数据库建立条目
|
||||
* @param data 文件的数据
|
||||
* @param fileName 文件名,包括拓展名
|
||||
* @return 成功时返回文件id,失败时返回FileSystem.FAILED
|
||||
*/
|
||||
public int addFile(byte data[], String fileName) throws Exception
|
||||
{
|
||||
AppendixFile appendixFile = createFileTable(fileName);
|
||||
appendixFile = appendixFileService.save(appendixFile);
|
||||
File file = new File(rootDir,""+appendixFile.getId());
|
||||
FileOutputStream outputStream;
|
||||
if(file.exists())
|
||||
throw new FileNameConflict(
|
||||
"file name conflict,there is a file in the directory, and is not created by this program",
|
||||
file.getName());
|
||||
File parent = file.getParentFile();
|
||||
if(!parent.exists())
|
||||
parent.mkdirs();
|
||||
try{
|
||||
file.createNewFile();
|
||||
outputStream = new FileOutputStream(file);
|
||||
outputStream.write(data);
|
||||
outputStream.close();
|
||||
return appendixFile.getId();
|
||||
}
|
||||
catch (Exception e){
|
||||
appendixFileService.delete(appendixFile);
|
||||
e.printStackTrace();
|
||||
throw new Exception(e);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 根据id获取一个磁盘中的文件
|
||||
* @param id 文件的id
|
||||
* @return 成功返回文件的InputStream,失败返回null
|
||||
*/
|
||||
public InputStream getFile(int id)throws AppendixFileNotFoundException
|
||||
{
|
||||
Optional<AppendixFile> optionalAppendixFile = appendixFileService.findById(id);
|
||||
if(!optionalAppendixFile.isPresent())
|
||||
throw new AppendixFileNotFoundException(
|
||||
"the required id does not exist in the database",id,
|
||||
AppendixFileNotFoundException.ID_NOT_FOUND);
|
||||
|
||||
AppendixFile appendixFile = appendixFileService.findById(id).get();
|
||||
File file = new File(rootDir,""+appendixFile.getId());
|
||||
|
||||
if(file.exists())
|
||||
{
|
||||
try {
|
||||
InputStream inputStream = new FileInputStream(file);
|
||||
return inputStream;
|
||||
} catch (FileNotFoundException e) {
|
||||
e.printStackTrace();
|
||||
throw new AppendixFileNotFoundException(
|
||||
"the required id exists in the database, but the stream can not be opened",id,
|
||||
AppendixFileNotFoundException.STREAM_FAILURE);
|
||||
}
|
||||
}
|
||||
else
|
||||
throw new AppendixFileNotFoundException(
|
||||
"the required id exists in the database, but the file is missing",id,
|
||||
AppendixFileNotFoundException.FILE_NOT_fOUND);
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除一个文件,如果该文件不存在,则不会发生操作
|
||||
* @param id 要删除文件的id
|
||||
*/
|
||||
public void deleteFile(int id)
|
||||
{
|
||||
Optional<AppendixFile> optionalAppendixFile = appendixFileService.findById(id);
|
||||
if(!optionalAppendixFile.isPresent())
|
||||
return;
|
||||
AppendixFile appendixFile = appendixFileService.findById(id).get();
|
||||
File file = new File(rootDir,""+appendixFile.getId());
|
||||
if(file.exists()) {
|
||||
file.delete();
|
||||
appendixFileService.delete(appendixFile);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据id获取一个文件的条目,其中包含文件信息
|
||||
* @param id 要寻找条目的id
|
||||
*/
|
||||
public AppendixFile getFileData(int id)
|
||||
{
|
||||
Optional<AppendixFile> optionalAppendixFile = appendixFileService.findById(id);
|
||||
if(!optionalAppendixFile.isPresent())
|
||||
throw new AppendixFileNotFoundException(
|
||||
"the required id does not exist in the database",id,
|
||||
AppendixFileNotFoundException.ID_NOT_FOUND);
|
||||
|
||||
AppendixFile appendixFile = appendixFileService.findById(id).get();
|
||||
|
||||
return appendixFile;
|
||||
}
|
||||
|
||||
/**
|
||||
* 维护数据库,删去所有文件已经缺失的条目(仅用于在文件系统出现故障时的维护)
|
||||
*/
|
||||
public void databaseRefresh()
|
||||
{
|
||||
for (AppendixFile appendixFile:
|
||||
appendixFileService.findAll()) {
|
||||
File file = new File(rootDir,""+appendixFile.getId());
|
||||
if(!file.exists())
|
||||
appendixFileService.delete(appendixFile);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 维护磁盘,删除指定根目录下所有不在数据库中的文件(仅用于文件系统出现故障时的维护)
|
||||
*/
|
||||
public void diskRefresh()
|
||||
{
|
||||
File dir = new File(rootDir);
|
||||
|
||||
if (dir.exists()) {
|
||||
if (null == dir.listFiles()) {
|
||||
return;
|
||||
}
|
||||
for(File file : dir.listFiles())
|
||||
{
|
||||
int id;
|
||||
try{
|
||||
id = Integer.parseInt(file.getName());
|
||||
if(!appendixFileService.findById(id).isPresent())
|
||||
file.delete();
|
||||
}
|
||||
catch (Exception ex){
|
||||
file.delete();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,11 @@
|
||||
package com.codesdream.ase.exception.conflict;
|
||||
|
||||
public class FileNameConflict extends RuntimeException {
|
||||
public String conflictName;
|
||||
public FileNameConflict(String msg,String conflictName)
|
||||
{
|
||||
super(msg);
|
||||
this.conflictName = conflictName;
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,15 @@
|
||||
package com.codesdream.ase.exception.notfound;
|
||||
|
||||
import com.codesdream.ase.model.activity.AppendixFile;
|
||||
|
||||
public class AppendixFileNotFoundException extends NotFoundException {
|
||||
public int id;
|
||||
public int type;
|
||||
public static final int ID_NOT_FOUND = 1, FILE_NOT_fOUND = 2, STREAM_FAILURE = 3;
|
||||
|
||||
public AppendixFileNotFoundException(String msg,int id,int type){
|
||||
super(msg);
|
||||
this.id = id;
|
||||
this.type = type;
|
||||
}
|
||||
}
|
@ -0,0 +1,27 @@
|
||||
package com.codesdream.ase.model.activity;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||
import lombok.Data;
|
||||
|
||||
import javax.persistence.*;
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.Date;
|
||||
|
||||
@Data
|
||||
@Entity
|
||||
@Table(name = "appendixFile")
|
||||
public class AppendixFile {
|
||||
@Id
|
||||
@GeneratedValue(strategy = GenerationType.AUTO)
|
||||
private int id;
|
||||
|
||||
@Column(name = "file_name")
|
||||
private String fileName;
|
||||
|
||||
@Column(name = "type")
|
||||
private String type;
|
||||
|
||||
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
|
||||
@Column(name = "last_edit_time")//, nullable = false)
|
||||
private LocalDateTime lastEditTime = LocalDateTime.of(2020,2,18,16,36);
|
||||
}
|
@ -0,0 +1,10 @@
|
||||
package com.codesdream.ase.repository.activity;
|
||||
|
||||
import com.codesdream.ase.model.activity.AppendixFile;
|
||||
import org.springframework.data.repository.CrudRepository;
|
||||
import org.springframework.stereotype.Repository;
|
||||
|
||||
@Repository
|
||||
public interface AppendixFileRespository extends CrudRepository<AppendixFile, Integer> {
|
||||
|
||||
}
|
@ -0,0 +1,36 @@
|
||||
package com.codesdream.ase.service;
|
||||
|
||||
import com.codesdream.ase.model.activity.AppendixFile;
|
||||
import com.codesdream.ase.repository.activity.AppendixFileRespository;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.util.Optional;
|
||||
|
||||
@Service
|
||||
public class AppendixFileService implements IAppendixFileService {
|
||||
|
||||
@Resource
|
||||
private AppendixFileRespository appendixFileRespository;
|
||||
|
||||
|
||||
@Override
|
||||
public AppendixFile save(AppendixFile appendixFile) {
|
||||
return appendixFileRespository.save(appendixFile);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void delete(AppendixFile appendixFile) {
|
||||
appendixFileRespository.delete(appendixFile);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Optional<AppendixFile> findById(int id) {
|
||||
return appendixFileRespository.findById(id);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Iterable<AppendixFile> findAll() {
|
||||
return appendixFileRespository.findAll();
|
||||
}
|
||||
}
|
@ -0,0 +1,21 @@
|
||||
package com.codesdream.ase.service;
|
||||
|
||||
import com.codesdream.ase.model.activity.AppendixFile;
|
||||
|
||||
import java.util.Optional;
|
||||
|
||||
public interface IAppendixFileService {
|
||||
|
||||
//存储磁盘文件条目
|
||||
AppendixFile save(AppendixFile appendixFile);
|
||||
|
||||
//删除磁盘文件条目
|
||||
void delete(AppendixFile appendixFile);
|
||||
|
||||
//通过ID寻找文件条目
|
||||
Optional<AppendixFile> findById(int id);
|
||||
|
||||
//找到所有文件条目
|
||||
Iterable<AppendixFile> findAll();
|
||||
|
||||
}
|
75
src/test/java/com/codesdream/ase/test/FileSystemTest.java
Normal file
75
src/test/java/com/codesdream/ase/test/FileSystemTest.java
Normal file
@ -0,0 +1,75 @@
|
||||
package com.codesdream.ase.test;
|
||||
|
||||
import com.codesdream.ase.component.activity.FileSystem;
|
||||
import com.codesdream.ase.model.activity.AppendixFile;
|
||||
import com.codesdream.ase.repository.activity.AppendixFileRespository;
|
||||
import com.codesdream.ase.service.AppendixFileService;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.springframework.boot.test.context.SpringBootTest;
|
||||
import org.springframework.test.context.junit4.SpringRunner;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
|
||||
@SpringBootTest
|
||||
@RunWith(SpringRunner.class)
|
||||
public class FileSystemTest {
|
||||
|
||||
@Resource
|
||||
FileSystem fileSystem;
|
||||
|
||||
@Resource
|
||||
AppendixFileService appendixFileService;
|
||||
|
||||
@Test
|
||||
public void getPresentFilesTest()
|
||||
{
|
||||
Iterable<AppendixFile> appendixFiles = appendixFileService.findAll();
|
||||
for (AppendixFile appendixFile:
|
||||
appendixFiles) {
|
||||
System.out.println(appendixFile.getFileName()+" "+appendixFile.getId()+" "+appendixFile.getType()+
|
||||
" "+appendixFile.getLastEditTime().toString());
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void DeleteAllFilesTest()
|
||||
{
|
||||
Iterable<AppendixFile> appendixFiles = appendixFileService.findAll();
|
||||
for (AppendixFile appendixFile:
|
||||
appendixFiles) {
|
||||
fileSystem.deleteFile(appendixFile.getId());
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void createFile()
|
||||
{
|
||||
int id1 = 0;
|
||||
try {
|
||||
id1 = fileSystem.addFile("asfasefasgasgasg".getBytes(),"test1.txt");
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
try {
|
||||
int id2 = fileSystem.addFile("aspgjparjgpoarjgpjpeg".getBytes(),"test2.jpeg");
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
|
||||
InputStream inputStream = fileSystem.getFile(id1);
|
||||
byte[] bytes = new byte[200];
|
||||
try {
|
||||
inputStream.read(bytes);
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
System.out.println(bytes.toString());
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in New Issue
Block a user