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

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.*
import java.util.concurrent.ConcurrentLinkedQueue import java.util.concurrent.ConcurrentLinkedQueue
import java.util.concurrent.atomic.AtomicBoolean import java.util.concurrent.atomic.AtomicBoolean
import java.util.regex.Pattern
class ActPost : AppCompatActivity(), class ActPost : AppCompatActivity(),
View.OnClickListener, 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() val multipart_builder = MultipartBody.Builder()
.setType(MultipartBody.FORM) .setType(MultipartBody.FORM)
@ -1829,7 +1847,9 @@ class ActPost : AppCompatActivity(),
} }
multipart_builder.addFormDataPart( multipart_builder.addFormDataPart(
"file", getDocumentName(contentResolver, uri), object : RequestBody() { "file",
fileName,
object : RequestBody() {
override fun contentType() : MediaType? { override fun contentType() : MediaType? {
return MediaType.parse(opener.mimeType) return MediaType.parse(opener.mimeType)
} }
@ -1870,13 +1890,14 @@ class ActPost : AppCompatActivity(),
pa.attachment = a pa.attachment = a
} }
} }
return result result
} else { } else {
val multipart_body = MultipartBody.Builder() val multipart_body = MultipartBody.Builder()
.setType(MultipartBody.FORM) .setType(MultipartBody.FORM)
.addFormDataPart( .addFormDataPart(
"file", "file",
getDocumentName(contentResolver, uri), fileName,
object : RequestBody() { object : RequestBody() {
override fun contentType() : MediaType? { override fun contentType() : MediaType? {
return MediaType.parse(opener.mimeType) return MediaType.parse(opener.mimeType)
@ -1918,7 +1939,7 @@ class ActPost : AppCompatActivity(),
pa.attachment = a pa.attachment = a
} }
} }
return result result
} }
} catch(ex : Throwable) { } catch(ex : Throwable) {
@ -2053,11 +2074,13 @@ class ActPost : AppCompatActivity(),
} }
} }
private fun showVisibility(){ private fun showVisibility() {
btnVisibility.setImageResource(Styler.getVisibilityIconId( btnVisibility.setImageResource(
account?.isMisskey == true Styler.getVisibilityIconId(
, visibility ?: TootVisibility.Public account?.isMisskey == true
)) , visibility ?: TootVisibility.Public
)
)
} }
private fun performVisibility() { private fun performVisibility() {

View File

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