我有这个春季启动应用程序,它使用传统的文件上传和下载方式(通过在服务器上创建一个文件夹),它将文件从html作为multipart,我们还有我们的android应用程序Web服务,它将数据发送到其他控制器作为base64然后将其转换为字节格式。 请告诉我如何以最小的更改为s3存储桶实现相同的代码。
服务实施类
package com.erp.serviceimpl;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import org.apache.commons.codec.binary.Base64;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import com.erp.model.Document;
import com.erp.repository.DocumentRepository;
import com.erp.service.DocumentService;
@Service
public class DocumentServiceImpl implements DocumentService {
@Autowired
DocumentRepository documentrepository;
// Save the uploaded file to this folder
private static String UPLOADED_FOLDER = "s3://elasticbeanstalk-ap-south-1-461760552509/imagesUpload/";
@Override
public boolean uploadUserImage(MultipartFile file, Document document) {
System.out.println("pooja" + file);
boolean status = false;
if (document != null) {
document.setDate(new Date());
document.setTurbine_id(document.getTurbine_id());
Document documentImage = documentrepository.save(document);
if (documentImage != null) {
try {
byte[] bytes = file.getBytes();
Path path = Paths.get(UPLOADED_FOLDER + document.getDocId() + "_" + file.getOriginalFilename());
Files.write(path, bytes);
} catch (IOException e) {
e.printStackTrace();
}
documentImage.setUploadImagesPath(document.getDocId() + "_" + file.getOriginalFilename());
documentrepository.save(documentImage);
return true;
} else {
return false;
}
}
return status;
}
@Override
public List<Document> getAllImages() {
return documentrepository.findAll();
}
@Override
public List<Document> findAllByTurbine_id(int turbine_id) {
// TODO Auto-generated method stub
Iterable<Document> itr = documentrepository.findAllByTurbine_id(turbine_id);
return (List<Document>)itr;
}
@Override
public boolean uploadUserWebServiceImage(Document document) {
boolean status = false;
if (document != null) {
document.setDate(new Date());
document.setTurbine_id(document.getTurbine_id());
Document documentImage = documentrepository.save(document);
if (documentImage != null) {
try {
String[] img = document.getImageBase().split(",");
byte[] imageByte = Base64.decodeBase64(img[1]);
Path path = Paths.get(UPLOADED_FOLDER + documentImage.getDocId() + "_" + document.getUploadImagesPath());
Files.write(path, imageByte);
} catch (IOException e) {
e.printStackTrace();
}
documentImage.setUploadImagesPath(documentImage.getDocId() + "_" + document.getUploadImagesPath());
documentrepository.save(documentImage);
status = true;
return status;
}
}
return status;
}
}
控制器类。
package com.erp.controller;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
import com.erp.model.Document;
import com.erp.service.DocumentService;
import com.erp.service.EmployeeService;
import com.erp.service.TurbineService;
import com.erp.utils.IConstant;
@Controller
@ComponentScan
public class DocumentController {
@Autowired
DocumentService documentService;
@Autowired
TurbineService turbineService;
@Autowired
EmployeeService employeeService;
@GetMapping("/addDocument/{turbine_id}")
public String newDocument(@PathVariable Integer turbine_id, Model model) {
Document document = new Document();
document.setTurbine_id(turbine_id);
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
model.addAttribute("employee", employeeService.findEmployeeByUsername(auth.getName()));
model.addAttribute("turbine", turbineService.findTurbine(turbine_id));
model.addAttribute("addDocument", document);
model.addAttribute("viewDocuments", (ArrayList<Document>) documentService.findAllByTurbine_id(turbine_id));
return "turbine-documents";
}
@RequestMapping(value = "/documentUpload", method = { RequestMethod.GET, RequestMethod.POST })
private String saveUploadImages(@RequestParam("file") MultipartFile file,
@ModelAttribute("Document") Document document, ModelMap model,
final RedirectAttributes redirectAttributes) {
boolean status = documentService.uploadUserImage(file, document);
if (status) {
model.addAttribute(IConstant.MESSAGE, IConstant.UPLOAD_IMAGE_SUCCESS_MESSAGE);
redirectAttributes.addFlashAttribute("message", IConstant.UPLOAD_IMAGE_SUCCESS_MESSAGE);
redirectAttributes.addFlashAttribute("alertClass", "alert-success");
} else {
model.addAttribute(IConstant.MESSAGE, IConstant.UPLOAD_IMAGE_FAILURE_MESSAGE);
redirectAttributes.addFlashAttribute("message", IConstant.UPLOAD_IMAGE_FAILURE_MESSAGE);
redirectAttributes.addFlashAttribute("alertClass", "alert-danger");
}
return "redirect:/addDocument/" + document.getTurbine_id();
}
@RequestMapping(value = "download", method = RequestMethod.GET)
@ResponseBody
public ResponseEntity<byte[]> downloadFile(@RequestParam("uploadImagesPath") String uploadImagesPath)
throws IOException {
String filename = "s3://elasticbeanstalk-ap-south-1-461760552509/imagesUpload/" + uploadImagesPath;
@SuppressWarnings("resource")
InputStream inputImage = new FileInputStream(filename);
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
byte[] buffer = new byte[512];
int l = inputImage.read(buffer);
while (l >= 0) {
outputStream.write(buffer, 0, l);
l = inputImage.read(buffer);
}
HttpHeaders headers = new HttpHeaders();
headers.set("Content-Type", "image/jpeg");
headers.set("Content-Type", "application/pdf");
headers.set("Content-Disposition", "attachment; filename=\"" + uploadImagesPath + "");
return new ResponseEntity<byte[]>(outputStream.toByteArray(), headers, HttpStatus.OK);
}
}
Thymeleaf页面:
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org"
xmlns:sec="http://www.thymeleaf.org/extras/spring-security">
<head>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<title>Documents</title>
<meta
content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no"
name="viewport" />
<link rel="shortcut icon" href="images/ctmi_favicon.png"
th:href="@{/images/ctmi_favicon.png}" />
<link rel="apple-touch-icon" href="images/ctmi_favicon-57x57.png"
th:href="@{/images/ctmi_favicon-57x57.png}" />
<link rel="apple-touch-icon" sizes="72x72"
href="images/ctmi_favicon-72x72.png"
th:href="@{/images/ctmi_favicon-72x72.png}" />
<link rel="apple-touch-icon" sizes="114x114"
href="images/ctmi_favicon-114x114.png"
th:href="@{/images/ctmi_favicon-114x114.png}" />
<!-- css -->
<link rel="stylesheet" type="text/css" href="css/bootstrap.min.css"
th:href="@{/css/bootstrap.min.css}" />
<link rel="stylesheet" type="text/css" href="css/font-awesome.min.css"
th:href="@{/css/font-awesome.min.css}" />
<link rel="stylesheet" type="text/css" href="css/jquery-ui.min.css"
th:href="@{/css/jquery-ui.min.css}" />
<link rel="stylesheet" type="text/css" href="css/style.css"
th:href="@{/css/style.css}" />
<link rel="stylesheet" type="text/css" href="css/responsive.css"
th:href="@{/css/responsive.css}" />
<!--[if IE]>
<script src="js/html5shiv.js" th:src="@{/js/html5shiv.js}" ></script>
<![endif]-->
<!-- js -->
<!-- js -->
<script type="text/javascript" src="js/jquery.min.js"
th:src="@{/js/jquery.min.js}"></script>
<script type="text/javascript" src="js/bootstrap.min.js"
th:src="@{/js/bootstrap.min.js}"></script>
<script type="text/javascript" src="js/jquery-ui.min.js"
th:src="@{/js/jquery-ui.min.js}"></script>
<script type="text/javascript" src="js/custom.js"
th:src="@{/js/custom.js}"></script>
</head>
<body class="alBody">
<!-- Preloader -->
<div class="preLoader"></div>
<!-- Header -->
<header>
<div class="container">
<div class="hdrLogo">
<img src="images/chola_turbo_logo.png"
th:src="@{/images/chola_turbo_logo.png}" alt="cholaturbo Logo"
class="logoDefault" />
</div>
<div class="hdrRight">
<div class="hdrrInr">
<div class="hdrrLeft">
<ul>
<li class="logoutIcn">
<a href="#" th:href="@{/page/home}">
<i class="fa fa-home fa-7x" aria-hidden="true"></i>
</a>
</li>
<li class="logoutIcn">
<a href="#" th:href="@{/employee/edit/{employee_id}(employee_id=${employee.employee_id})}" >
<i class="fa fa-user fa-7x" aria-hidden="true"></i>
</a>
</li>
<li class="logoutIcn"><a href="/logout"><i
class="fa fa-sign-out" aria-hidden="true"></i></a></li>
</ul>
</div>
</div>
</div>
</div>
</header>
<!-- Body Content Sec -->
<section class="bodyCnt">
<!-- Top Bread Sec -->
<div class="topBread">
<div class="container">
<ol class="breadcrumb">
<li><a href="#"
th:href="@{/client/{client_id}(client_id=${turbine.client_id})}">BACK</a></li>
<li class="active">Documents</li>
</ol>
<div class="addProj"></div>
</div>
</div>
<!-- Main body page -->
<div class="mbSec">
<div class="container">
<div class="dbWrap clearfix">
<div class="col-md-3">
<div class="bsSgl">
<div class="bsInr">
<div class="dbsHead">
<h4>Turbine Details</h4>
</div>
<ul class="side-menu">
<li><a href="turbine-details-new.html"
th:href="@{/turbine/{turbine_id}(turbine_id=${addDocument.turbine_id})}">Turbine
Details </a></li>
<li><a href="turbine-engneer-assigned.html"
th:href="@{/AddAssignTurbine/{turbine_id}(turbine_id=${addDocument.turbine_id})}">Engneer
Assigned</a></li>
<li><a href="turbine-site-report.html"
th:href="@{/addAddService/{turbine_id}(turbine_id=${addDocument.turbine_id})}">Site
Report</a></li>
<li><a href="turbine-site-readings.html"
th:href="@{/readingPage/{turbine_id}(turbine_id=${addDocument.turbine_id})}">Site
Reading</a></li>
<li><a href="turbine-material.html"
th:href="@{/material/{turbine_id}(turbine_id=${addDocument.turbine_id})}">Materials And Spares</a></li>
<li><a href="turbine-documents.html"
th:href="@{/addDocument/{turbine_id}(turbine_id=${addDocument.turbine_id})}"
class="active">Documents</a></li>
<li><a href="turbine-drawings.html"
th:href="@{/addDrawing/{turbine_id}(turbine_id=${addDocument.turbine_id})}">Drawings</a></li>
<li><a href="turbine-ta-da.html"
th:href="@{/AddDailyAllowance/{turbine_id}(turbine_id=${addDocument.turbine_id})}">TA
DA Bill</a></li>
<li sec:authorize="hasAuthority('ADMIN')"><a
href="turbine-man-days-expenses.html"
th:href="@{/ManDays/{turbine_id}(turbine_id=${addDocument.turbine_id})}">
Man Days Expenses</a></li>
<li><a href="turbine-client-delay.html"
th:href="@{/addClientDelay/{turbine_id}(turbine_id=${addDocument.turbine_id})}">Client
Delay</a></li>
<li sec:authorize="hasAuthority('ADMIN')"><a
href="turbine-client-requests.html"
th:href="@{/AddClientResponse/{turbine_id}(turbine_id=${addDocument.turbine_id})}">Client
Requests</a></li>
<li><a href="turbine-generate-report"
th:href="@{/generateReportPage/{turbine_id}(turbine_id=${addDocument.turbine_id})}">Generate
Report</a></li>
</ul>
</div>
</div>
</div>
<!-- end left bar -->
<div class="col-md-9 bsSgl">
<div class="bsInr">
<div class="dbsHead">
<h4>Documents</h4>
</div>
<div th:if="${message}" th:text="${message}"
th:class="${'alert ' + alertClass}"></div>
<form class="row" action="#" th:action="@{/documentUpload}"
th:object="${addDocument}" method="post"
enctype="multipart/form-data">
<div class="bsMtr">
<div class="col-md-9">
<div class="snglInpt">
<input type="file" name="file"
placeholder="Upload Image" th:required="required" /> <input
type="hidden" th:field="*{turbine_id}" name="turbine_id"
id="turbine_id" placeholder="Turbine Id" />
</div>
</div>
<div class="col-md-3">
<button class="btn btn-success" type="submit">Submit</button>
</div>
</div>
</form>
</div>
<div class="clearfix"></div>
<div class="bsInr mrg-top-20">
<div class="bsMtr">
<div class="table-responsive">
<table class="table" id="doc_list">
<tbody>
<tr>
<td>TurbineId</td>
<td>Image</td>
<td>Date</td>
<td>Download Image</td>
</tr>
<tr th:each="viewDocument : ${viewDocuments}">
<td th:text="${viewDocument.docId}"></td>
<td th:text="${viewDocument.uploadImagesPath}"></td>
<td th:text="${viewDocument.date}"></td>
<td><a
th:href="@{|/download?uploadImagesPath=${viewDocument.uploadImagesPath}|}"><span
th:text="${viewDocument.uploadImagesPath}"></span></a></td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
<!-- end col md 12 -->
</div>
</div>
</div>
</section>
<!-- Footer -->
<footer>
<div class="container">
<p>Copyright © 2018 cholaturbo</p>
</div>
</footer>
</body>
</html>
安卓控制器:
package com.erp.webService;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import com.erp.model.Document;
import com.erp.service.DocumentService;
import com.erp.utils.IConstant;
@RestController
@RequestMapping("/api")
public class DocumentWebService {
@Autowired
DocumentService documentService;
private static String UPLOADED_FOLDER = "//var//sentora//hostdata//cholaerp//public_html//imagesUpload//";
@RequestMapping(value = "uploadFile", method = RequestMethod.POST)
public @ResponseBody Map<String, Object> saveUserImage(@RequestBody Document document) throws IOException {
int turbine_id = document.getTurbine_id();
Map<String, Object> map = new HashMap<String, Object>();
boolean documents = documentService.uploadUserWebServiceImage(document);
if (documents) {
List<Document> list = documentService.findAllByTurbine_id(turbine_id);
for (Document doc : list) {
doc.setImageBase(null);
doc.setUploadImagesPath(doc.getUploadImagesPath());
}
map.put(IConstant.RESPONSE, IConstant.RESPONSE_SUCCESS_MESSAGE);
map.put(IConstant.MESSAGE, IConstant.UPLOAD_IMAGE_SUCCESS_MESSAGE);
map.put(IConstant.DATA, list);
} else {
map.put(IConstant.RESPONSE, IConstant.RESPONSE_NO_DATA_MESSAGE);
map.put(IConstant.MESSAGE, IConstant.UPLOAD_IMAGE_FAILURE_MESSAGE);
}
return map;
}
@RequestMapping(value = "/downloadFile", method = RequestMethod.GET)
@ResponseBody
public ResponseEntity<byte[]> downloadFile(@RequestParam("uploadImagesPath") String uploadImagesPath)
throws IOException {
String filename = "https://s3.console.aws.amazon.com//s3//buckets//elasticbeanstalk-ap-south-1-461760552509//?region=ap-south-1&tab=overview//imagesUpload//" + uploadImagesPath;
@SuppressWarnings("resource")
InputStream inputImage = new FileInputStream(filename);
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
byte[] buffer = new byte[512];
int l = inputImage.read(buffer);
while (l >= 0) {
outputStream.write(buffer, 0, l);
l = inputImage.read(buffer);
}
HttpHeaders headers = new HttpHeaders();
headers.set("Content-Type", "image/jpeg");
headers.set("Content-Type", "application/pdf");
headers.set("Content-Disposition", "attachment; filename=\"" + uploadImagesPath + "");
return new ResponseEntity<byte[]>(outputStream.toByteArray(), headers, HttpStatus.OK);
}
@GetMapping(value = "/getAllImages", produces = "application/json")
public List<Document> getAllImages() {
return (List<Document>) documentService.getAllImages();
}
@GetMapping(value = "/getAllDocument/{turbine_id}", produces = "application/json")
public List<Document> getAllByTurbineId(@PathVariable(value = "turbine_id") int turbine_id) {
return (List<Document>) documentService.findAllByTurbine_id(turbine_id);
}
}
答案 0 :(得分:0)
为什么不试试Spring Content?它完全符合您的需求,您无需编写任何的代码。
假设maven,Spring Boot和Spring Data(让我知道你是否正在使用别的东西): -
的pom.xml
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!-- HSQL -->
<dependency>
<groupId>org.hsqldb</groupId>
<artifactId>hsqldb</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.hateoas</groupId>
<artifactId>spring-hateoas</artifactId>
</dependency>
<dependency>
<groupId>com.github.paulcwarren</groupId>
<artifactId>content-s3-spring-boot-starter</artifactId>
<version>${spring-content-version}</version>
</dependency>
<dependency>
<groupId>com.github.paulcwarren</groupId>
<artifactId>content-rest-spring-boot-starter</artifactId>
<version>${spring-content-version}</version>
</dependency>
...
<dependencies>
使用托管的Spring内容注释更新您的实体。
Document.java
@Entity
public class Document {
...existing fields...
@ContentId
private String contentId;
@ContentLength
private Long contentLen;
@MimeType
private String mimeType;
...getters and setters...
}
创建与S3商店的连接。已经实现了S3 Store以使用SimpleStorageResourceLoader,因此这个bean最终将被你的商店使用。
StoreConfig.java
@Configuration
@EnableS3Stores
public class S3Config {
@Autowired
private Environment env;
public Region region() {
return Region.getRegion(Regions.fromName(System.getenv("AWS_REGION")));
}
@Bean
public BasicAWSCredentials basicAWSCredentials() {
return new BasicAWSCredentials(env.getProperty("AWS_ACCESS_KEY_ID"), env.getProperty("AWS_SECRET_KEY"));
}
@Bean
public AmazonS3 client(AWSCredentials awsCredentials) {
AmazonS3Client amazonS3Client = new AmazonS3Client(awsCredentials);
amazonS3Client.setRegion(region());
return amazonS3Client;
}
@Bean
public SimpleStorageResourceLoader simpleStorageResourceLoader(AmazonS3 client) {
return new SimpleStorageResourceLoader(client);
}
}
定义键入文档的商店 - 因为这是您要将内容与之关联的内容。
DocumentContentStore.java
@StoreRestResource(path="documentContent")
public interface DocumentStore extends ContentStore<Document, String> {
}
运行时,您还需要为商店设置存储桶。这可以通过在application.properties/yaml中指定spring.content.s3.bucket
或通过设置AWS_BUCKET
环境变量来完成。
这足以创建基于REST的内容服务,用于在S3中存储内容并将该内容与您的Document
实体相关联。 Spring Content将看到Store接口和S3依赖项。假设您要在S3中存储内容并为您注入接口的实现。意思是你不必自己实现它。您可以通过将多部分表单数据请求发布到:
POST /documentcontent/{documentId}
并使用以下内容重新获取
GET /documentscontent/{documentId}
(该服务支持完整的CRUD BTW和视频流,以防可能很重要)。
您会看到Spring Content通过为您管理与内容相关的注释来将内容与您的实体相关联。
这可以在有或没有Spring Data REST的情况下使用。依赖关系有点不同。我假设你没有使用Spring Data REST。如果情况不是这样,请告诉我,我会更新示例。
有一个here的视频 - 演示开始大约一半。它使用Filesystem模块而不是S3,但它们是可互换的。只需要为您正在使用的商店类型选择正确的依赖项。在你的情况下S3。
HTH