使用 tranferutility 将我的对象从我在 kotlin 中的 android 项目上传到 AWS S3

Upload my object to AWS S3 from my android project in kotlin using tranferutility

我对 android studio 和 kotlin 都很业余。但是,我正在设计一个应用程序,我在其中收集用户数据并需要 post 以匿名方式将其 post 发送到 AWS s3,而无需认知身份验证。我已经完成了将图像上传到 aws S3 的示例,但是我如何 post 我的 json 对象到 AWS S3。我已经阅读了一些文档,但我仍然停留在 transferutility.upload。因为大多数用于上传的代码片段都在谈论一个文件,我冻结在那里因为,我只想要 post 我的对象。

到目前为止我尝试了什么。接口代码:

interface IMyAPI {

@GET("child/{dynamic}/learningpods_new")
fun getDynamic(@Path("dynamic")dynamic:String):Observable<ArrayList<Data>>

@POST("parent/")
fun createParent(@Body parentDetails: ParentDetails):Call<ParentDetails>
}

我可以从指定的端点到达,但我不想 post 到达相同的端点。

改装代码:

object RetrofitClient {
private var OurInstance : Retrofit?=null
val instance:Retrofit
get() {
    if (OurInstance==null)
    {
        OurInstance =Retrofit.Builder()
                .baseUrl("http://coreapi.imagin8ors.org:8080/v1/")
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .build()
    }
    return OurInstance!!
  }
}

posting 代码片段:

val retrofit = RetrofitClient.instance
jsonAPI = retrofit.create(IMyAPI::class.java)
val call=jsonAPI.createParent(new_parent)
call.enqueue(object :Callback<ParentDetails>{
        override fun onFailure(call: Call<ParentDetails>?, t: Throwable?) {
            Toast.makeText(this@ParentmainActivity,"something went wrong",Toast.LENGTH_LONG).show()
        }

        override fun onResponse(call: Call<ParentDetails>?, response: Response<ParentDetails>?) {
            Toast.makeText(this@ParentmainActivity,"successful :"+response?.code(),Toast.LENGTH_LONG).show()
        }

    })

感谢任何帮助。

如果您想 post 将对象上传到 AWS S3,可以使用名称为 putObject 的方法将对象上传到 AWS S3。下面的代码片段是上传包含 "name" 的对象的示例方法。您可以在指定的桶中找到相同的东西。

val background= object :Thread() {
        override fun run() {
            try {
                try {
                    AWSMobileClient.getInstance().initialize(baseContext)
                    credentials = BasicAWSCredentials(AWSutils().KEY,AWSutils().SECRET)
                    s3Client = AmazonS3Client(credentials)
                    val response=s3Client.putObject(AWSutils().bucket_name,"jsa3/NewParentData","name")
                } catch(e:AmazonServiceException) {
                    // The call was transmitted successfully, but Amazon S3 couldn't process
                    // it, so it returned an error response.
                    e.printStackTrace();
                }
                catch(e:AmazonClientException) {
                    // Amazon S3 couldn't be contacted for a response, or the client
                    // couldn't parse the response from Amazon S3.
                    e.printStackTrace();
                }
            }catch (e:Exception){
                e.printStackTrace()
            }
        }
    }
    background.start()

此外,上传不能在主线程上进行,因此您必须创建另一个线程来执行此上传,这就是上面代码中显示的内容。如果您问我如何知道对象是否已成功 posted:一种方法是使用您的 aws s3 帐户签入您的存储桶,另一种方法是执行 getobject 并打印 objectContent。这应该表明您能够 post 数据。

但是,可能会有一些顾虑:我们必须确保您上传的是对象,而不是对象的新实例。将对象上传到 aws s3 的另一件事是您不能附加数据,只会发生覆盖。所以,如果你想要一个对象的集合,那么使用putObject方法是不明智的-----这是在用例场景下,这个可以进一步讨论。