# 파일 공유
# 라이브러리 사용 방법
해당 라이브러리는 따로 API KEY를 발급받거나 CMS에서 설정해야 하는 사전 설정이 없습니다.
아래 내용을 읽고 진행하시면 됩니다.
- 파일 업로드
파일을 업로드 하기 위해서는 먼저 미디어파일의 접근권한이 있어야 하며,
파일의 절대 경로 또는 파일객체를 받아왔다는 가정하에 진행을 합니다.
- 파일 업로드 하고자 하는 파일을 서버로 전송
파일을 전송하기 위해서는 roomId 가 필요합니다.
파라미터는 fileUpload(
룸 ID
,파일 명
,파일 객체
,업로드 리스너
,콜백함수
) 로 전달을 하게 되고 아래는 그 예제입니다.
VChatCloudApi.getInstance().fileUpload(options.channelKey, file_name, file, listener, new ApiCallback() {
@Override
public void onFailure(VChatCloudException e) {
Log.e(TAG, "onFailure: " + e);
}
@Override
public void onSuccess(JSONObject json) {
Log.d(TAG, json.toString());
}
});
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
- 업로드 중 리스너를 통해서 진행상태를 업데이트가 가능하며 코드는 아래와 같이 구현을 하면 됩니다.
private ProgressRequestManager.Listener listener = new ProgressRequestManager.Listener() {
@Override
public void onProgress(int progress) {
Log.d("onProgress", progress + "%");
}
};
1
2
3
4
5
6
2
3
4
5
6
- 업로드가 완료가 되면
onSuccess
또는onFailure
리턴이 되어지고, 성공 시 처리는 아래와 같습니다.
@Override
public void onSuccess(JSONObject json) {
Log.d(TAG, json.toString());
JSONObject data = (JSONObject) json.get("data");
JSONObject param = new JSONObject();
JSONObject message = new JSONObject();
JSONArray list = new JSONArray();
JSONObject messageType = new JSONObject();
message.put("id", data.get("fileKey"));
message.put("name", data.get("fileNm"));
message.put("type", data.get("fileExt"));
message.put("size", data.get("fileSize"));
message.put("expire", data.get("expire"));
list.add(message);
messageType.put("profile", String.valueOf(nick_icon_index + 1));
param.put("message", list.toJSONString());
param.put("mimeType", "file");
param.put("messageType", messageType.toJSONString());
if (userInfo != null) {
param.put("userInfo", userInfo.toJSONString());
}
// 공통 전송메소드 발췌
channel.sendMessage(param, (o, e) -> {
if (e != null) {
Log.d(TAG,"메시지 전송오류");
}
});
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
JSONObject 리턴 데이터
값 | 서브 | 식별자 | 설명 |
---|---|---|---|
result_msg | - | String | 실패 시 사유 |
result_cd | - | int | 성공 (1), 실패(0) |
data | ▽ | Object | 서버에서 받은 OpenGraph정보 - 없을경우 빈값으로 대체 |
fileNm | String | 업로드한 파일 명 | |
fileSize | String | 파일 사이즈 | |
expire | String | 파일 유효기간 | |
fileKey | String | 파일 고유키 | |
fileSizeText | String | 파일 사이즈 텍스트 | |
fileExt | String | 파일 확장자 |
- 메시지로 공유되어진 파일타입의 경우
mimeType
이file
으로 되어있으니, id 값을 이용하여 바이너리를 다운로드 합니다.
이때 안드로이드에서 다운로드는 Thread 로 요청해야 동작을 합니다.
new Thread(() -> {
boolean downFlag = true;
String url = Constant.BASE + Constant.LOADFILE + "?fileKey=" + object.get("id");
URL _url = new URL(url);
URLConnection urlConnection = _url.openConnection();
int all = urlConnection.getContentLength();
InputStream inputStream = urlConnection.getInputStream();
File file1 = new File("파일 디렉토리", "파일 명");
file1.setReadable(true);
file1.setWritable(true);
file1.setExecutable(true);
file1.createNewFile();
if (file1.canWrite()) {
FileOutputStream fileOutputStream = new FileOutputStream(file1);
byte[] bytes = new byte[1024];
int len;
try {
while ((len = inputStream.read(bytes)) > 0 ) {
fileOutputStream.write(bytes, 0, len);
}
} catch (SocketException se) {
downFlag = false;
file1.delete();
} finally {
fileOutputStream.close();
}
}
inputStream.close();
if (downFlag) {
Runtime.getRuntime().exec("chmod 755" + file1.getPath());
handler.sendMessage(handler.obtainMessage()); // 성공 화면 처리
fileFlag = true;
} else {
fileFlag = true;
goneHandler.sendMessage(goneHandler.obtainMessage()); // 실패 화면 처리
}
handler.sendMessage(handler.obtainMessage());
fileFlag = true;
}).start();
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43