如何在Java中使用环境变量值访问cloudinary API?

时间:2018-08-19 18:34:58

标签: java gradle environment-variables cloudinary

我需要使用cloudinary的java API将图像上传到Exception in thread "main" com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Unterminated object at line 3 column 26 at com.google.gson.Gson.fromJson(Gson.java:809) at com.google.gson.Gson.fromJson(Gson.java:734) at Prova.main(Prova.java:11) Caused by: com.google.gson.stream.MalformedJsonException: Unterminated object at line 3 column 26 at com.google.gson.stream.JsonReader.syntaxError(JsonReader.java:1310) 。我创建了cloudinary帐户,通过该帐户我获得了API cloudinaryCloud nameAPI Key。使用这些东西,我可以像下面这样将图像上传到cloudinary:

API Secret

但是现在我的问题是我将此代码保存在公共git repo中,然后从那里将代码推送到@PostMapping("/uploadPic") public ResponseEntity<Object> upload(@RequestParam("file") MultipartFile multipartFile){ String cloudinaryImgURL=null; try { File fileDir = new File("rowFiles"); if (! fileDir.exists()){ fileDir.mkdir(); } String fileName=multipartFile.getOriginalFilename(); File physicalFile=new File(multipartFile.getOriginalFilename()); FileOutputStream fout=new FileOutputStream(fileDir.getName()+"/"+physicalFile); fout.write(multipartFile.getBytes()); fout.close(); //For stack-overflow question using dummy values for credientials. Cloudinary cloudinary = new Cloudinary(ObjectUtils.asMap( "cloud_name", "your_cloud_name", "api_key", "your_api_key", "api_secret", "your_secret_key")); File toUpload = new File("rowFiles/"+fileName); Map params = ObjectUtils.asMap("public_id", "SRWRestImageBase/"+fileName); Map uploadResult =Singleton.getCloudinary().uploader().upload(toUpload, params); toUpload.delete(); System.out.println("==============>>"+uploadResult.get("url")); cloudinaryImgURL=uploadResult.get("url").toString(); } catch (Exception e) { System.out.println("upload:"+e.getMessage()); // TODO: handle exception } return new ResponseEntity<Object>("File uploaded successfully:"+cloudinaryImgURL,HttpStatus.OK); } 。但是使用此方法会将HerokucloudinaryCloud name之类的API Key详细信息暴露给我不想要的每个人。

在查看getting started的cloudinary文档时,我发现了使用环境变量来存储这些值并从那里访问它的方法,但是文档并不能正确地指导我。

我用过 在Java EE环境中,可以设置Java EE容器可用的环境变量:

API Secret

这将使您能够接收Cloudinary实例:

CLOUDINARY_URL=cloudinary://{api_key}:{api_secret}@{cloud_name}

但是我收到类Cloudinary cloudinary = Singleton.getCloudinary(); 的编译时错误,该错误在任何jar中都找不到。查看其他文章,此类应为Singleton,但是我的cloudinary jar没有此类。

我正在使用cloudinary gradle依赖项:

com.cloudinary.Singleton

如果有人可以指导我正确的方向,将不胜感激。 预先感谢。

1 个答案:

答案 0 :(得分:1)

我找到了自己的解决方案。 我们必须设置环境变量CLOUDINARY_URL=cloudinary://{api_key}:{api_secret}@{cloud_name}并重新启动Eclipse以反映环境变量的更改以及后续更改。这样,它不会将我的帐户详细信息公开披露。

@PostMapping("/uploadPic")
public ResponseEntity<Object> upload(@RequestParam("file") MultipartFile multipartFile){
    String cloudinaryImgURL=null;
    try {
        File fileDir = new File("rowFiles");
        if (! fileDir.exists()){
            fileDir.mkdir();
        }
        String fileName=multipartFile.getOriginalFilename();
        File physicalFile=new File(multipartFile.getOriginalFilename());
        FileOutputStream fout=new FileOutputStream(fileDir.getName()+"/"+physicalFile);
        fout.write(multipartFile.getBytes());
        fout.close();
        File toUpload = new File("rowFiles/"+fileName);
        Cloudinary cloudinary = new Cloudinary();
        System.out.println("API Key:"+cloudinary.config.apiKey);
        Map params = ObjectUtils.asMap("public_id", "SRWRestImageBase/"+fileName);
        Map uploadResult = cloudinary.uploader().upload(toUpload, params);
        toUpload.delete();
        System.out.println("==============>>"+uploadResult.get("url"));
        cloudinaryImgURL=uploadResult.get("url").toString();
    } catch (Exception e) {
        System.out.println("upload:"+e.getMessage());
    }
    return new ResponseEntity<Object>("File uploaded successfully:"+cloudinaryImgURL,HttpStatus.OK);
}