簡體   English   中英

AWS使用JAVA從s3對象創建新文件獲取錯誤

[英]AWS Creating new files from an s3 object using JAVA getting error

我有一個形狀文件,我需要從我的java代碼中讀取形狀文件。 我使用下面的代碼來讀取形狀文件。

public class App {
    public static void main(String[] args) {
        File file = new File("C:\\Test\\sample.shp");
        Map<String, Object> map = new HashMap<>();//
        try {
            map.put("url", URLs.fileToUrl(file));
            DataStore dataStore = DataStoreFinder.getDataStore(map);
            String typeName = dataStore.getTypeNames()[0];
            SimpleFeatureSource source = dataStore.getFeatureSource(typeName);
            SimpleFeatureCollection collection = source.getFeatures();

            try (FeatureIterator<SimpleFeature> features = collection.features()) {
                while (features.hasNext()) {
                    SimpleFeature feature = features.next();
                    SimpleFeatureType schema = feature.getFeatureType();
                    Class<?> geomType = schema.getGeometryDescriptor().getType().getBinding();

                    String type = "";
                    if (Polygon.class.isAssignableFrom(geomType) || MultiPolygon.class.isAssignableFrom(geomType)) {

                        MultiPolygon geom = (MultiPolygon) feature.getDefaultGeometry();
                        type = "Polygon";
                        if (geom.getNumGeometries() > 1) {
                            type = "MultiPolygon";
                        }
                    } else if (LineString.class.isAssignableFrom(geomType)
                            || MultiLineString.class.isAssignableFrom(geomType)) {
                    } else {

                    }
                    System.out.println(feature.getDefaultGeometryProperty().getValue().toString());

                }
            }
        } catch (Exception e) {
            // TODO: handle exception
        }

    }
}

我得到了所需的輸出。 但我的要求是寫一個aws lambda函數來讀取shape文件。 為此1.我創建了一個s3事件的Lambda java項目。 我在handleRequest中編寫了相同的代碼。 我將java lambda項目作為lanbda函數上傳並添加了一個觸發器。 當我將.shp文件上傳到s3時,lmbda函數會自動調用。 但我收到如下錯誤

java.lang.RuntimeException:java.io.FileNotFoundException:/sample.shp(沒有這樣的文件或目錄)

我的s3存儲桶里面有sample.shp文件。 我通過以下鏈接。 如何將S3對象寫入文件?

我得到了同樣的錯誤。 我試着改變我的代碼,如下所示

  S3Object object = s3.getObject(new GetObjectRequest(bucket, key)); 
  InputStream objectData = object.getObjectContent();
  map.put("url", objectData );

代替

File file = new File("C:\\Test\\sample.shp"); 
 map.put("url", URLs.fileToUrl(file));

:-(現在我收到如下錯誤

顯示java.lang.NullPointerException

我也試過下面的代碼

DataStore dataStore = DataStoreFinder.getDataStore(objectData);

代替

DataStore dataStore = DataStoreFinder.getDataStore(map);

錯誤如下

java.lang.ClassCastException:com.amazonaws.services.s3.model.S3ObjectInputStream無法強制轉換為java.util.Map

此外,我嘗試將鍵直接添加到地圖,也作為DataStore對象。 一切都錯了..:-(

有沒有人可以幫助我? 如果有人能為我做這件事會非常有幫助...

geotools中的DataStoreFinder.getDataStore方法要求您提供包含鍵和值“url”的鍵/值對的映射。 與“url”鍵關聯的值必須是文件URL,如“file://host/path/my.shp”。

您正在嘗試將Java輸入流插入到地圖中。 這不起作用,因為它不是文件URL。

geotools庫不接受http / https URL(請參閱此處此處的geotools代碼),因此您需要一個file:// URL。 這意味着您需要將文件從S3下載到本地Lambda文件系統,然后提供指向該本地文件的file:// URL。 要做到這一點,這里的Java代碼應該工作:

// get the shape file from S3 to local filesystem
File localshp = new File("/tmp/download.shp");
s3.getObject(new GetObjectRequest(bucket, key), localshp);

// now store file:// URL in the map
map.put("url", localshp.getURI().getURL().toString());

如果geotools庫已接受真實URL(不僅僅是file:// URL),那么您可以避免下載,只需為S3對象創建一個有時間限制的預簽名URL,並將該URL放入地圖中。

這是一個如何做到這一點的例子:

// get current time and add one hour
java.util.Date expiration = new java.util.Date();
long msec = expiration.getTime();
msec += 1000 * 60 * 60;
expiration.setTime(msec);

// request pre-signed URL that will allow bearer to GET the object
GeneratePresignedUrlRequest gpur = new GeneratePresignedUrlRequest(bucket, key);
gpur.setMethod(HttpMethod.GET);
gpur.setExpiration(expiration);

// get URL that will expire in one hour
URL url = s3.generatePresignedUrl(gpur);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM