添付メディアのアップロード時にファイル名を適当にエスケープする

This commit is contained in:
tateisu 2019-01-18 13:42:29 +09:00
parent 8a2eaaf151
commit ce49332b79
2 changed files with 38 additions and 19 deletions

View File

@ -58,6 +58,7 @@ import java.lang.ref.WeakReference
import java.util.*
import java.util.concurrent.ConcurrentLinkedQueue
import java.util.concurrent.atomic.AtomicBoolean
import java.util.regex.Pattern
class ActPost : AppCompatActivity(),
View.OnClickListener,
@ -1818,8 +1819,25 @@ class ActPost : AppCompatActivity(),
)
}
fun fixDocumentName(s : String) : String {
val s_length = s.length
val m = Pattern.compile("""([^\x20-\x7f])""").matcher(s)
m.reset()
val sb = StringBuilder(s_length)
var lastEnd = 0
while(m.find()) {
sb.append(s.substring(lastEnd,m.start()))
val escaped = m.group(1).encodeUTF8().encodeHex()
sb.append(escaped)
lastEnd = m.end()
}
if(lastEnd < s_length) sb.append(s.substring(lastEnd,s_length))
return sb.toString()
}
if(account.isMisskey) {
val fileName = fixDocumentName(getDocumentName(contentResolver, uri))
return if(account.isMisskey) {
val multipart_builder = MultipartBody.Builder()
.setType(MultipartBody.FORM)
@ -1829,7 +1847,9 @@ class ActPost : AppCompatActivity(),
}
multipart_builder.addFormDataPart(
"file", getDocumentName(contentResolver, uri), object : RequestBody() {
"file",
fileName,
object : RequestBody() {
override fun contentType() : MediaType? {
return MediaType.parse(opener.mimeType)
}
@ -1870,13 +1890,14 @@ class ActPost : AppCompatActivity(),
pa.attachment = a
}
}
return result
result
} else {
val multipart_body = MultipartBody.Builder()
.setType(MultipartBody.FORM)
.addFormDataPart(
"file",
getDocumentName(contentResolver, uri),
fileName,
object : RequestBody() {
override fun contentType() : MediaType? {
return MediaType.parse(opener.mimeType)
@ -1918,7 +1939,7 @@ class ActPost : AppCompatActivity(),
pa.attachment = a
}
}
return result
result
}
} catch(ex : Throwable) {
@ -2053,11 +2074,13 @@ class ActPost : AppCompatActivity(),
}
}
private fun showVisibility(){
btnVisibility.setImageResource(Styler.getVisibilityIconId(
account?.isMisskey == true
, visibility ?: TootVisibility.Public
))
private fun showVisibility() {
btnVisibility.setImageResource(
Styler.getVisibilityIconId(
account?.isMisskey == true
, visibility ?: TootVisibility.Public
)
)
}
private fun performVisibility() {

View File

@ -88,15 +88,11 @@ fun CharArray.toByteArray() : ByteArray {
////////////////////////////////////////////////////////////////////
// CharSequence
fun CharSequence.replaceFirst(pattern : Pattern, replacement : String) : String {
return pattern.matcher(this).replaceFirst(replacement)
// replaceFirstの戻り値がplatform type なので expression body 形式にすると警告がでる
}
fun CharSequence.replaceFirst(pattern : Pattern, replacement : String) : String =
pattern.matcher(this).replaceFirst(replacement)
fun CharSequence.replaceAll(pattern : Pattern, replacement : String) : String {
return pattern.matcher(this).replaceAll(replacement)
// replaceAllの戻り値がplatform type なので expression body 形式にすると警告がでる
}
fun CharSequence.replaceAll(pattern : Pattern, replacement : String) : String =
pattern.matcher(this).replaceAll(replacement)
// %1$s を含む文字列リソースを利用して装飾テキストの前後に文字列を追加する
fun CharSequence?.intoStringResource(context : Context, string_id : Int) : Spannable {
@ -151,7 +147,7 @@ fun String.encodeUTF8() = this.toByteArray(charsetUTF8)
fun ByteArray.decodeUTF8() = this.toString(charsetUTF8)
// 16進ダンプ
private fun ByteArray.encodeHex() : String {
fun ByteArray.encodeHex() : String {
val sb = StringBuilder()
for(b in this) {
sb.appendHex2(b.toInt())