如何使用我当前的代码将下载文件上传到amazon s3存储桶

时间:2018-05-01 09:21:36

标签: amazon-web-services spring-boot amazon-s3 download upload

我有这个春季启动应用程序,它使用传统的文件上传和下载方式(通过在服务器上创建一个文件夹),它将文件从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);
    }
}

1 个答案:

答案 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

相关问题