angular - 如何在 Spring Boot 中通过 Rest API 下载文件?
问题描述
我有弹簧靴(背面)和 angular7(正面)应用程序。我需要上传和下载文件。这是我的后端代码
@Entity
@Table
public class File extends BaseEntity {
private String fileName;
private String fileType;
@Lob
private byte[] data;
我的文件存储库:
public interface FileRepo extends CrudRepository<File, Long> {
}
我的文件服务
@Service
public class FileService {
private FileRepo fileRepo;
public FileService(FileRepo fileRepo) {
this.fileRepo = fileRepo;
}
public File storeFile(MultipartFile file){
String fileName = StringUtils.cleanPath(file.getOriginalFilename());
try{
File file1 = new File(fileName, file.getContentType(),file.getBytes());
return fileRepo.save(file1);
} catch (IOException io){
throw new FileStorageException("" + fileName + ". !", io);
}
}
}
和我的控制器,我只有两种方法通过 id 上传和下载:
@CrossOrigin(origins = "*", maxAge = 3_600)
@RestController
@RequestMapping(value = "/file")
public class FileController {
private static final Logger log = LogManager.getLogger(FileController.class);
private FileService fileService;
private FileRepo fileRepo;
@Autowired
public FileController(FileService fileService,FileRepo fileRepo){
this.fileRepo = fileRepo;
this.fileService = fileService;
}
@PostMapping("/upload")
public ResponseEntity uploadFile(@RequestParam("file") MultipartFile file) {
try {
// fileService.storeFile(file);
return ResponseEntity.ok(fileService.storeFile(file));
} catch (Exception e) {
throw new FileStorageException("", e);
}
}
@RequestMapping(value = "/get/{id}")
public ResponseEntity<?> get(@PathVariable("id") long id) {
try {
File file = fileRepo.findById(id).orElseThrow(() -> new CustomException(String.format("", id)));
// return ResponseEntity.ok().contentType(MediaType.parseMediaType(file.getFileType())).header(HttpHeaders.CONTENT_DISPOSITION,"attachment; filename=\"" + file.getFileName() + "\"")
// .body(new ByteArrayResource(file.getData()));
return ResponseEntity.ok(file);
} catch (CustomException e) {
log.error(e.getMessage());
return ResponseEntity.badRequest().body(e.getMessage());
}
}
}
如何在下载中将正确的表单发送到 Angular。上传我认为的作品 XD
解决方案
您可以使用 apache commons 的 FileUtils 来完成。构造您想要的 url 并执行以下代码:
import org.apache.commons.io.FileUtils; //import
URL url = getClass().getResource(filePath);
File file = new File(url.getPath());
if (file.exists()) file.delete();
try {
FileUtils.copyURLToFile(new URL(downloadLink), file, 10000, 10000);
} catch (IOException e) {
e.printStackTrace();
}
依赖:
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.7</version>
</dependency>
您可以根据需要更改上述代码。就我而言,我从 web url 下载了一个 csv 文件。
推荐阅读
- postgresql - 在 Debian 虚拟机上安装 PostgreSQL 9.1 期间的 PATH 设置问题
- c# - LINQ查询选择的新类,如何转移到另一个模型?
- nativescript - 具有数据绑定的常规文本在 NativeScript 中仅显示纯文本
- javascript - 使用 webpack/babel 运行业力时出现“意外字符串”
- openwrt - 创建 LUCI ipk 包
- typescript - 从对象推断(不扩展类型)属性
- angular - cordova-plugin-facebook4 的 ionic 2 问题
- php - 根据大小调整和替换 Laravel 请求中的所有文件
- java - 如何在单个拆分中标记带有和不带分隔符的字符串
- excel - For循环捕获不同命名范围内的值