【问题标题】:Load a pdf into S3 using User Defined Java Class in Pentaho使用 Pentaho 中的用户定义 Java 类将 pdf 加载到 S3
【发布时间】:2021-01-12 01:03:57
【问题描述】:
import com.amazonaws.AmazonServiceException;
import com.amazonaws.SdkClientException;
import com.amazonaws.auth.AWSStaticCredentialsProvider;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.model.ObjectMetadata;
import com.amazonaws.services.s3.model.PutObjectRequest;

import java.io.File;
import java.io.IOException;

public class UploadObject {

  public static void main(String[] args) throws IOException {

    Regions clientRegion = Regions.US_EAST_1;

    String fileObjKeyName = "N.pdf";

    String fileName = "C:\\home\\aws\\N.pdf";

    //To Test the File Upload

    String accessKeyId = "AKIAZGSMNGVXXXZ73VXE";

    String secretAccessKey = "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";

    String bucketName = "fioprod-s3-addon-us-east-12";

    try {

      final BasicAWSCredentials basicAWSCredentials = new BasicAWSCredentials(accessKeyId, secretAccessKey);

      //This code expects that you have AWS credentials set up per:

      // https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/setup-credentials.html

      AmazonS3 s3Client = AmazonS3ClientBuilder.standard()
          .withRegion(clientRegion)
          .withCredentials(new AWSStaticCredentialsProvider(basicAWSCredentials))
          .build();

      // Upload a file as a new object with ContentType and title specified.

      PutObjectRequest request = new PutObjectRequest(bucketName, fileObjKeyName, new File(fileName));

      ObjectMetadata metadata = new ObjectMetadata();

      metadata.setContentType("plain/text");

      metadata.addUserMetadata("title", "someTitle");

      request.setMetadata(metadata);

      s3Client.putObject(request);

    } catch (AmazonServiceException e) {

      // The call was transmitted successfully, but Amazon S3 couldn't process

      // it, so it returned an error response.

      e.printStackTrace();

    } catch (SdkClientException e) {

      // Amazon S3 couldn't be contacted for a response, or the client

      // couldn't parse the response from Amazon S3.

      e.printStackTrace();

    }

  }

}

当我从 IntelliJ IDE 运行时,上面的代码可以很好地将 pdf 文件加载到 S3 中。我希望这段代码移动到 Pentaho“用户定义的类”,当我这样做时它会抛出错误 - “无法加载导入的类“com.amazonaws.auth.AWSStaticCredentialsProvider””

我该如何解决?我的最终目标是使用 pentaho 将 .pdf 或 .zip 文件加载到 S3 中。

感谢您的宝贵时间。

【问题讨论】:

    标签: java amazon-s3 pentaho


    【解决方案1】:

    您编写了很好的代码,并且运行良好。您只需要将 aws-java-sdk jar 保存到您的 data-integration/lib 位置。

    您可以从Here下载sdk jar文件

    您也可以从 Here 查看我的 KTR,我在其中包含了您的代码,并在 PDI 中的 User-defined-java-class 中对您的代码进行了小的更改

    import com.amazonaws.AmazonServiceException;
    import com.amazonaws.SdkClientException;
    import com.amazonaws.auth.AWSStaticCredentialsProvider;
    import com.amazonaws.auth.BasicAWSCredentials;
    import com.amazonaws.regions.Regions;
    import com.amazonaws.services.s3.AmazonS3;
    import com.amazonaws.services.s3.AmazonS3ClientBuilder;
    import com.amazonaws.services.s3.model.ObjectMetadata;
    import com.amazonaws.services.s3.model.PutObjectRequest;
    
    import java.io.File;
    import java.io.IOException;
    
    public boolean processRow(StepMetaInterface smi, StepDataInterface sdi) throws KettleException{
        Object[] r = getRow();
     
     if (r == null) {
            setOutputDone();
            return false;
        }
    
    
    
        Regions clientRegion = Regions.US_EAST_1;
    
        String fileObjKeyName = "N.pdf";
    
        String fileName = "C:\\home\\aws\\N.pdf";
    
        //To Test the File Upload
    
        String accessKeyId = "AKIAZGSMNGVXXXZ73VXE";
    
        String secretAccessKey = "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";
    
        String bucketName = "fioprod-s3-addon-us-east-12";
        
    
          final BasicAWSCredentials basicAWSCredentials = new BasicAWSCredentials(accessKeyId, secretAccessKey);
    
          //This code expects that you have AWS credentials set up per:
    
          // https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/setup-credentials.html
    
          AmazonS3 s3Client = (AmazonS3)AmazonS3ClientBuilder.standard().withRegion(clientRegion).withCredentials(new AWSStaticCredentialsProvider(basicAWSCredentials)).build();
    
          // Upload a file as a new object with ContentType and title specified.
    
          PutObjectRequest request = new PutObjectRequest(bucketName, fileObjKeyName, new File(fileName));
    
          ObjectMetadata metadata = new ObjectMetadata();
    
          metadata.setContentType("plain/text");
    
          metadata.addUserMetadata("title", "someTitle");
    
          request.setMetadata(metadata);
    
          s3Client.putObject(request);
    
       
        putRow(data.outputRowMeta, r);
         return true;
    
    }
    

    【讨论】:

    • 如果我想从上一步中引入以下几行,正确的方法应该是什么?尝试使用 DataGrid,但尚未工作: String fileObjKeyName = "N.pdf";字符串文件名 = "C:\\home\\aws\\N.pdf"; String bucketName = "fioprod-s3-addon-us-east-12";
    • 你可以在这里查看我的工作和 KTR:drive.google.com/drive/folders/…
    • 就像在 MainJob 中一样,您已经设置了所有变量;因此,如果您从 S3 转换中读取这些变量会很好。是的,请使用 "String getFilename = getVariable("FILENAME");"在您的“用户定义 Java 类”步骤中肯定会起作用。
    • 最终,当这两个变量按预期工作时,我会将所有变量移至主作业;我使用了“String fileObjKeyName = getVariable("FILENAME"); String fileName = getVariable("LOCALDIR").concat(fileObjKeyName);"当我执行作业时,它没有失败,但没有文件上传到 S3; drive.google.com/drive/u/0/folders/…
    • 无需步骤“从结果中获取行”。删除此步骤并运行该过程。并在 MainJob 中将变量范围更改为“在 Java 虚拟机中有效”。我想一切都会好起来的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-10
    • 2019-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多