欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringBoot讀寫xml上傳到AWS存儲服務S3的示例

 更新時間:2020年10月27日 09:15:07   作者:白42  
這篇文章主要介紹了SpringBoot讀寫xml上傳到S3的示例,幫助大家更好的理解和使用springboot框架,感興趣的朋友可以了解下

最近的工作涉及到了生成xml文件并上傳到AWS存儲服務S3這樣的處理。期間遇到了兩個問題,簡單記錄下:

  • springboot讀取xml模板異常
  • 將生成的xml上傳到S3的問題

springboot的版本是0,讀寫xml文件使用的是Dom4J,版本是1。逐個說明下遇到的這幾個問題。

1.springboot讀取xml模板異常

現(xiàn)階段是將xml模板文件存儲在springboot項目的resource目錄下的。具體路徑為

template/xxx.xml

最初是通過類加載器獲取文件路徑后再嘗試讀取模板文件的:

String fullPath = TemplateParser.class.getClassLoader().getResource(pathXml).getFile();
File file = new File(fullPath);
SAXReader reader = new SAXReader();
Document document = reader.read(file);

通過類加器獲取到的文件路徑是:

file:/path/of/jar/springboot-xml.jar!/BOOT-INF/classes!/template/xxx.xml

不過我們都知道,springboot是將整個工程包括配置文件打成一個jar包后再直接運行。這樣想在linux的服務器上通過文件路徑找文件是注定找不到的。

后來改成直接通過SpringBoot提供的 ClassResource類來獲取resource路徑下的配置文件:

ClassPathResource resource = new ClassPathResource(pathXml);
Document doc = reader.read(resource.getInputStream());

這里直接使用 InputStream讀取的模板文件。注意不要再嘗試通過調(diào)用 ClassResource實例的 getFile()方法來獲取文件,不然會遇到和之前同樣的問題。

額,期間還發(fā)生了無法將模板文件打進springboot項目運行時的jar文件這樣的問題。因為是將模板文件存儲在了resources的子目錄下,需要調(diào)整下maven打包的配置:

<resources>
    <resource>
        <directory>src/main/resources</directory>
        <filtering>true</filtering>
        <includes>
            <include>**/*</include>
        </includes>
    </resource>
</resources>

下面這幾行如果沒有的話需要加上,不然會讀取不到子目錄中的配置文件:

    <includes>
        <include>**/*</include>
    </includes>

2.將生成的xml上傳到S3

AWS提供的最便捷的上傳文件接口是這個:

   public PutObjectResult putObject(String bucketName, String key, File file)
            throws SdkClientException, AmazonServiceException;

這個接口通過 File實例來執(zhí)行上傳。所以我一開始的想法是先生成一個臨時文件保存在服務器本地,讀取本地臨時文件為 File執(zhí)行上傳,最后再刪掉本地的臨時文件。這個思路是沒問題的,在本地執(zhí)行也OK。但是在生產(chǎn)環(huán)境,由于權限相關的問題,生成臨時文件失敗了。

不想再去折騰權限相關的事情,所以將出路寄托在了AWS提供的另一個接口上:

  public PutObjectResult putObject(
            String bucketName, String key, InputStream input, ObjectMetadata metadata)
            throws SdkClientException, AmazonServiceException;

也就是說考慮將xml文件內(nèi)容輸出到 InputStream,然后再將InputStream上傳到S3。一切都在內(nèi)存里執(zhí)行,不依賴外部文件系統(tǒng)也就不會有文件權限的問題。

這個方案的問題在于 ObjectMetaData這個類有點兒黑箱的意思。該怎么設置需要進行一些摸索??戳艘槐檫@個類的接口文檔,需要調(diào)用的也就這兩個set方法:

/**
     *  Set the date when the object is no longer cacheable.
     */
    public void setHttpExpiresDate(Date httpExpiresDate) {
        this.httpExpiresDate = httpExpiresDate;
    }
    
    /**
     * <p>
     * Sets the Content-Length HTTP header indicating the size of the
     * associated object in bytes.
     * </p>
     * <p>
     * This field is required when uploading objects to S3, but the AWS S3 Java
     * client will automatically set it when working directly with files. When
     * uploading directly from a stream, set this field if
     * possible. Otherwise the client must buffer the entire stream in
     * order to calculate the content length before sending the data to
     * Amazon S3.
     * </p>
     */
    public void setContentLength(long contentLength) {
        metadata.put(Headers.CONTENT_LENGTH, contentLength);
    }

其中后者(文件長度)是AWS建議設置的,不設置會在處理的時候給出WARN。根據(jù)方法文檔也可以看到,如果不設置,在上傳的時候就會在內(nèi)存中緩存整個信息流來計算文件長度。

至于前者是上傳到S3文件的緩存過期時間,酌情設置即可。

另一個需要解決的問題就是怎么將Dom4j生成的 Document輸出再讀取到 InputStream中。這里用到了 XmlWritter類,具體實現(xiàn)如下:

XMLWriter xmlWriter = new XMLWriter(outputStream, OutputFormat.createCompactFormat());
xmlWriter.write(doc);
xmlWriter.close();
return new ByteArrayInputStream(outputStream.toByteArray());

驗證了一下,這個方法是可行的。修改后生產(chǎn)環(huán)境沒有再報錯。

向AWS S3存儲服務上傳文件的實現(xiàn)代碼在這篇文章里:Java實現(xiàn)上傳文件到AWS S3

End!

以上就是SpringBoot讀寫xml上傳到S3的示例的詳細內(nèi)容,更多關于SpringBoot讀寫xml的資料請關注腳本之家其它相關文章!

相關文章

  • java8中Stream的使用以及分割list案例

    java8中Stream的使用以及分割list案例

    這篇文章主要介紹了java8中Stream的使用以及分割list案例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • 分布式服務Dubbo+Zookeeper安全認證實例

    分布式服務Dubbo+Zookeeper安全認證實例

    下面小編就為大家分享一篇分布式服務Dubbo+Zookeeper安全認證實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2017-12-12
  • SPRINGMVC JSON數(shù)據(jù)交互如何實現(xiàn)

    SPRINGMVC JSON數(shù)據(jù)交互如何實現(xiàn)

    這篇文章主要介紹了SPRINGMVC JSON數(shù)據(jù)交互如何實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-06-06
  • Spring解決循環(huán)依賴問題及三級緩存的作用

    Spring解決循環(huán)依賴問題及三級緩存的作用

    這篇文章主要介紹了Spring解決循環(huán)依賴問題及三級緩存的作用,所謂的三級緩存只是三個可以當作是全局變量的Map,Spring的源碼中大量使用了這種先將數(shù)據(jù)放入容器中等使用結束再銷毀的代碼風格
    2022-07-07
  • jasypt對配置文件的數(shù)據(jù)加密與解密方式

    jasypt對配置文件的數(shù)據(jù)加密與解密方式

    這篇文章主要介紹了jasypt對配置文件的數(shù)據(jù)加密與解密方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • elasticsearch數(shù)據(jù)信息索引操作action?support示例分析

    elasticsearch數(shù)據(jù)信息索引操作action?support示例分析

    這篇文章主要為大家介紹了elasticsearch數(shù)據(jù)信息索引操作action?support示例分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-04-04
  • SpringBoot實現(xiàn)redis延遲隊列的示例代碼

    SpringBoot實現(xiàn)redis延遲隊列的示例代碼

    延時隊列場景在我們?nèi)粘I(yè)務開發(fā)中經(jīng)常遇到,它是一種特殊類型的消息隊列,本文就來介紹一下SpringBoot實現(xiàn)redis延遲隊列的示例代碼,具有一定的參考價值,感興趣的可以了解一下
    2024-02-02
  • Java線程池的簡單使用方法實例教程

    Java線程池的簡單使用方法實例教程

    線程的使用在java中占有極其重要的地位,在jdk1.4極其之前的jdk版本中,關于線程池的使用是極其簡陋的,在jdk1.5之后這一情況有了很大的改,這篇文章主要給大家介紹了關于Java線程池的簡單使用方法,需要的朋友可以參考下
    2021-10-10
  • 完美解決request請求流只能讀取一次的問題

    完美解決request請求流只能讀取一次的問題

    這篇文章主要介紹了完美解決request請求流只能讀取一次的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • 詳細分析JAVA8新特性 Base64

    詳細分析JAVA8新特性 Base64

    這篇文章主要介紹了JAVA8新特性 Base64的相關資料,文中講解非常細致,代碼幫助大家更好的理解和學習,感興趣的朋友可以了解下
    2020-08-08

最新評論