添付メディアのアップロード時にファイル名を適当にエスケープする
This commit is contained in:
parent
8a2eaaf151
commit
ce49332b79
|
@ -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() {
|
||||||
|
|
|
@ -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())
|
||||||
|
|
Loading…
Reference in New Issue