Github API 从目录获取文件数据
Github API getting files data from directories
我正在尝试使用 Github API 来获取我创建的目录的内容。
这是我的目录结构:
- images
- mobile_images
- img1241251235
- extractedText.txt
- img.jpeg (these files might be larger then 1MB)
- img2142412312
- extractedText.txt
- img.jpeg
如您所见,我知道在 images/mobile_images/
目录中有一堆目录遵循一个结构。
从这些目录中,我想提取每个 extractedText.txt
文件的内容(存储在该文件中的文本)并保存每个 img.jpeg
.[=31 的 download_url =]
我遵循的步骤是:
在根目录(images/mobile_images)我叫this method and get a list of the directories within it (this response)。所以我得到 img124...
、img214...
等等。
现在我得到了所有目录(imgXX..
目录),我对每个目录调用相同的方法来获取它们的内容。这 return 是 extractedText.txt
和 img.jpeg
。 (步骤 1 的响应。)
到目前为止一切顺利。
现在,如果我在文件上调用相同的方法,它应该 return this。这适用于 extractedText.txt
文件,因为它们的大小不超过 1 MB,但对于图像文件,它会抛出错误。
我想获取如下所示的对象列表:
Image(val name: String, //this is something I extract from img123...
val date: Long, //this is something I extract from img123...
val extractedText: String, //this should be the text from extractedText.txt
val url: String) //this should be the download_url of img.jpeg file
你可以找到我当前的代码here。
在 that point 之前一切正常。当我到达文件时,我需要检查它是文本文件还是图像文件。
问题是我不知道如何管理 that "if case" 然后将我得到的数据(download_url
和 extractedText content
)合并到一个单个图像对象。这是我不知道如何处理的代码部分:
// from here starts the problem
.flatMap(object:
Function < ResponseBody, Observable < Any >> {
override fun apply(responseBody: ResponseBody): Observable < Any > {
return
if (responseBody.path.contains("txt", true)) {
// if the file is a text file I need to get the content of the file so I'll call this
mModel.getFile(responseBody.path) as Observable < Any >
} else {
// as I mentioned if the file is an img I only need to get download_url
responseBody.download_url
}
}
})
// merge the data into an Image file
.toList()
.observeOn(AndroidSchedulers.mainThread())
.subscribe(object: Consumer < MutableList < Image >> {
// ...
- 有没有更简单的方法来解决这个问题?
- 我的方法可以吗?
- 如何处理这种 "if" 情况以及如何将数据合并到单个 Image 对象中?
我设法实施了一个临时解决方案。
我写了两个函数 return:
- an
Observable
of the list 包含来自方法 mModel.getFile(responseBody.path)
的数据
- an
Observable
of the list 包含 responseBody.download_url
获得两个可观察对象后,我使用 .zip()
方法和 this 合并方法合并它们:
Observable.zip(getImageDataObservable(),
getImageDownloadUrlObservable(),
object: BiFunction < MutableList < Image > , MutableList < Image > , List < Image >> {
override fun apply(imageData: MutableList < Image > , imageUrl: MutableList < Image > ): List < Image > {
return combineImageObservables(imageData, imageUrl)
}
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(object: Consumer < List < Image >> {
override fun accept(images: List < Image > ? ) {
Log.d(TAG, "images = ${images?.size}")
Log.d(TAG, images.toString())
if (images != null) {
mViewDelegate.showImages(images)
} else {
mViewDelegate.showError("Try again!")
}
mViewDelegate.showSuccess("Displaying ${images?.size} images")
mViewDelegate.hideLoading()
}
}, object: Consumer < Throwable > {
override fun accept(t: Throwable ? ) {
Log.e(TAG, t.toString(), t)
if (t != null) {
mViewDelegate.showError(t.message)
} else {
mViewDelegate.showError("Error")
}
Crashlytics.logException(t)
mViewDelegate.hideLoading()
}
})
我正在尝试使用 Github API 来获取我创建的目录的内容。
这是我的目录结构:
- images
- mobile_images
- img1241251235
- extractedText.txt
- img.jpeg (these files might be larger then 1MB)
- img2142412312
- extractedText.txt
- img.jpeg
如您所见,我知道在 images/mobile_images/
目录中有一堆目录遵循一个结构。
从这些目录中,我想提取每个 extractedText.txt
文件的内容(存储在该文件中的文本)并保存每个 img.jpeg
.[=31 的 download_url =]
我遵循的步骤是:
在根目录(images/mobile_images)我叫this method and get a list of the directories within it (this response)。所以我得到
img124...
、img214...
等等。现在我得到了所有目录(
imgXX..
目录),我对每个目录调用相同的方法来获取它们的内容。这 return 是extractedText.txt
和img.jpeg
。 (步骤 1 的响应。)
到目前为止一切顺利。
现在,如果我在文件上调用相同的方法,它应该 return this。这适用于 extractedText.txt
文件,因为它们的大小不超过 1 MB,但对于图像文件,它会抛出错误。
我想获取如下所示的对象列表:
Image(val name: String, //this is something I extract from img123...
val date: Long, //this is something I extract from img123...
val extractedText: String, //this should be the text from extractedText.txt
val url: String) //this should be the download_url of img.jpeg file
你可以找到我当前的代码here。
在 that point 之前一切正常。当我到达文件时,我需要检查它是文本文件还是图像文件。
问题是我不知道如何管理 that "if case" 然后将我得到的数据(download_url
和 extractedText content
)合并到一个单个图像对象。这是我不知道如何处理的代码部分:
// from here starts the problem
.flatMap(object:
Function < ResponseBody, Observable < Any >> {
override fun apply(responseBody: ResponseBody): Observable < Any > {
return
if (responseBody.path.contains("txt", true)) {
// if the file is a text file I need to get the content of the file so I'll call this
mModel.getFile(responseBody.path) as Observable < Any >
} else {
// as I mentioned if the file is an img I only need to get download_url
responseBody.download_url
}
}
})
// merge the data into an Image file
.toList()
.observeOn(AndroidSchedulers.mainThread())
.subscribe(object: Consumer < MutableList < Image >> {
// ...
- 有没有更简单的方法来解决这个问题?
- 我的方法可以吗?
- 如何处理这种 "if" 情况以及如何将数据合并到单个 Image 对象中?
我设法实施了一个临时解决方案。
我写了两个函数 return:
- an
Observable
of the list 包含来自方法mModel.getFile(responseBody.path)
的数据
- an
Observable
of the list 包含responseBody.download_url
获得两个可观察对象后,我使用 .zip()
方法和 this 合并方法合并它们:
Observable.zip(getImageDataObservable(),
getImageDownloadUrlObservable(),
object: BiFunction < MutableList < Image > , MutableList < Image > , List < Image >> {
override fun apply(imageData: MutableList < Image > , imageUrl: MutableList < Image > ): List < Image > {
return combineImageObservables(imageData, imageUrl)
}
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(object: Consumer < List < Image >> {
override fun accept(images: List < Image > ? ) {
Log.d(TAG, "images = ${images?.size}")
Log.d(TAG, images.toString())
if (images != null) {
mViewDelegate.showImages(images)
} else {
mViewDelegate.showError("Try again!")
}
mViewDelegate.showSuccess("Displaying ${images?.size} images")
mViewDelegate.hideLoading()
}
}, object: Consumer < Throwable > {
override fun accept(t: Throwable ? ) {
Log.e(TAG, t.toString(), t)
if (t != null) {
mViewDelegate.showError(t.message)
} else {
mViewDelegate.showError("Error")
}
Crashlytics.logException(t)
mViewDelegate.hideLoading()
}
})