NIMSDK-AOS  10.9.43
FileAttachment.java
浏览该文件的文档.
1 package com.netease.nimlib.sdk.msg.attachment;
2 
3 import android.net.Uri;
4 import android.text.TextUtils;
5 import com.netease.nimlib.NimNosSceneKeyConstant;
7 import com.netease.nimlib.util.JSONHelper;
8 import com.netease.nimlib.util.MD5;
9 import com.netease.nimlib.util.StringUtil;
10 import com.netease.nimlib.util.storage.NimStorageType;
11 import com.netease.nimlib.util.storage.NimStorageUtil;
12 import java.io.File;
13 import org.json.JSONObject;
14 
15 /**
16  * 带有文件的附件类型的基类
17  * 描述文件的相关信息
18  */
19 public class FileAttachment implements MsgAttachment {
20 
21  private static final String TAG = "FileAttachment";
22  public static final String KEY_DOT = ".";
23 
24  /**
25  * 文件路径
26  */
27  protected String path;
28 
29  /**
30  * 文件大小
31  */
32  protected long size;
33 
34  /**
35  * 文件内容的MD5
36  */
37  protected String md5;
38 
39  /**
40  * 文件下载地址
41  */
42  protected String url;
43 
44  /**
45  * 文件显示名
46  */
47  protected String displayName;
48 
49  /**
50  * 文件后缀名
51  */
52  protected String extension;
53 
54  /**
55  * 过期时间(仅对文件类型有效)
56  */
57  private long expire;
58 
59  /**
60  * 上传文件时用的对token对应的场景,默认{@link NimNosSceneKeyConstant#NIM_DEFAULT_IM}
61  */
62  protected String nosTokenSceneKey = NimNosSceneKeyConstant.NIM_DEFAULT_IM;
63 
64  /**
65  * 如果服务器存在相同的附件文件,是否强制重新上传 , 默认false
66  */
67  protected boolean forceUpload = false;
68  /**
69  * 是否是uri
70  */
71  private boolean isUri = false;
72 
73  public FileAttachment() {
74 
75  }
76 
77  public FileAttachment(String attach) {
78  fromJson(attach);
79  }
80 
81  /**
82  * 获取文件本地路径,若文件不存在,返回null
83  *
84  * @return 文件路径
85  */
86  public String getPath() {
87  String path = getPathForSave();
88  return new File(path).exists() ? path : null;
89  }
90 
91  /**
92  * 获取用于保存该文件的位置
93  *
94  * @return 文件路径
95  */
96  public String getPathForSave() {
97  if (!isUri && !TextUtils.isEmpty(path)) {
98  return path;
99  } else {
100  return NimStorageUtil.getWritePath(getFileName(), storageType());
101  }
102  }
103 
104  /**
105  * 获取缩略图文件的本地路径,若文件不存在,返回null
106  *
107  * @return 文件路径
108  */
109  public String getThumbPath() {
110  String path = getThumbPathForSave();
111  return new File(path).exists() ? path : null;
112  }
113 
114  /**
115  * 获取用于保存缩略图文件的位置
116  *
117  * @return 文件路径
118  */
119  public String getThumbPathForSave() {
120  String fileName = getFileName();
121  if (!TextUtils.isEmpty(fileName)) {
122  int dotIndex = fileName.lastIndexOf(".");
123  // 如果找到了 '.' 而且最后一个字符不是 '.',则需要进行裁剪
124  if (dotIndex >= 0 && dotIndex < fileName.length() - 1) {
125  fileName = fileName.substring(0, dotIndex);
126  }
127  }
128  return NimStorageUtil.getWritePath(fileName, NimStorageType.TYPE_THUMB_IMAGE);
129  }
130 
131  /**
132  * 设置文件路径
133  *
134  * @param path 文件路径
135  */
136  public void setPath(String path) {
137  this.path = path;
138  this.isUri = UriUtils.isFileOrContentUri(path);
139  }
140 
141  /**
142  * 设置文件uri,
143  * 仅支持ContentResolver.SCHEME_FILE类型和ContentResolver.SCHEME_CONTENT类型的uri
144  * 仅支持发送消息时使用,接收的消息附件不支持uri
145  * @param uri
146  * @return false表示不支持的uri
147  */
148  public boolean setUri(Uri uri) {
149  if(uri == null)
150  {
151  return false;
152  }
153 
154  if(!UriUtils.isFileOrContentUri(uri))
155  {
156  return false;
157  }
158  isUri = true;
159  this.path = uri.toString();
160  return true;
161  }
162 
163  public Uri getUri() {
164  if(!isUri)
165  {
166  return null;
167  }
168  return UriUtils.string2Uri(path);
169  }
170 
171 
172 
173  /**
174  * 获取文件大小,单位为byte
175  *
176  * @return 文件大小
177  */
178  public long getSize() {
179  return size;
180  }
181 
182  /**
183  * 设置文件大小,单位为byte
184  *
185  * @param size 文件大小
186  */
187  public void setSize(long size) {
188  this.size = size;
189  }
190 
191  /**
192  * 获取文件内容MD5
193  *
194  * @return 内容MD5
195  */
196  public String getMd5() {
197  return md5;
198  }
199 
200  /**
201  * 设置文件内容MD5
202  *
203  * @param md5 内容MD5
204  */
205  public void setMd5(String md5) {
206  this.md5 = md5;
207  }
208 
209  /**
210  * 获取文件在服务器上的下载url。若文件还未上传,返回null
211  *
212  * @return 源站url
213  */
214  public String getUrl() {
215  return url;
216  }
217 
218  /**
219  * 设置文件在服务器上的下载url
220  *
221  * @param url
222  */
223  public void setUrl(String url) {
224  this.url = url;
225  }
226 
227  /**
228  * 获取文件后缀名
229  *
230  * @return 后缀名
231  */
232  public String getExtension() {
233  return extension;
234  }
235 
236  /**
237  * 设置文件后缀名
238  *
239  * @param extension 后缀名
240  */
241  public void setExtension(String extension) {
242  this.extension = extension;
243  }
244 
245  /**
246  * 获取文件名。
247  *
248  * @return
249  */
250  public String getFileName() {
251  if(isUri)
252  {
253  if (TextUtils.isEmpty(md5)) {
254  if (TextUtils.isEmpty(url)) {
255  return MD5.getStringMD5(path);
256  }
257  return MD5.getStringMD5(url);
258  } else {
259  return md5;
260  }
261  }
262  else if (!TextUtils.isEmpty(path)) {
263  return StringUtil.nameOfPath(path);
264  } else {
265  if (TextUtils.isEmpty(md5)) {
266  return MD5.getStringMD5(url);
267  } else {
268  return md5;
269  }
270  }
271  }
272 
273  /**
274  * 获取文件的显示名。可以和文件名不同,仅用于界面展示
275  *
276  * @return 文件显示名
277  */
278  public String getDisplayName() {
279  return displayName;
280  }
281 
282  /**
283  * 设置文件显示名
284  *
285  * @param displayName 文件显示名
286  */
287  public void setDisplayName(String displayName) {
288  this.displayName = displayName;
289  }
290 
291 
292  /**
293  * 获取文件上传时的nos scene
294  *
295  * @return nos scene
296  */
297  public String getNosTokenSceneKey() {
298  return nosTokenSceneKey;
299  }
300 
301  /**
302  * 设置文件上传时的nos scene
303  *
304  * @param nosTokenSceneKey
305  */
306  public void setNosTokenSceneKey(String nosTokenSceneKey) {
307  if (TextUtils.isEmpty(nosTokenSceneKey)) {
308  return;
309  }
310  this.nosTokenSceneKey = nosTokenSceneKey;
311  }
312 
313  public long getExpire() {
314  return expire;
315  }
316 
317  /**
318  * 文件是否强制重新上传
319  *
320  * @return force upload
321  */
322  public boolean isForceUpload() {
323  return forceUpload;
324  }
325 
326  /**
327  * 设置文件是否强制重新上传,默认false
328  *
329  * @param forceUpload 是否强制重新上传
330  */
331  public void setForceUpload(boolean forceUpload) {
332  this.forceUpload = forceUpload;
333  }
334 
335  protected NimStorageType storageType() {
336  return NimStorageType.TYPE_FILE;
337  }
338 
339  protected void save(JSONObject json) {
340 
341  }
342 
343  protected void load(JSONObject json) {
344 
345  }
346 
347  public static final String KEY_PATH = "path";
348  public static final String KEY_NAME = "name";
349  public static final String KEY_SIZE = "size";
350  public static final String KEY_MD5 = "md5";
351  public static final String KEY_URL = "url";
352  public static final String KEY_EXT = "ext";
353  public static final String KEY_SCENE = "sen";
354  public static final String KEY_FORCE_UPLOAD = "force_upload";
355  public static final String KEY_EXPIRE = "expire";
356 
357  public static final String KEY_V2_INTERNAL_UPLOAD_STATE = "KEY_V2_INTERNAL_UPLOAD_STATE";
358 
359  @Override
360  public String toJson(boolean send) {
361  JSONObject object = new JSONObject();
362  try {
363  if (!send && !TextUtils.isEmpty(path)) {
364  object.put(KEY_PATH, path);
365  }
366 
367  if (!TextUtils.isEmpty(md5)) {
368  object.put(KEY_MD5, md5);
369  }
370 
371  if (!TextUtils.isEmpty(displayName)) {
372  object.put(KEY_NAME, displayName);
373  }
374 
375  object.put(KEY_URL, url);
376  object.put(KEY_SIZE, size);
377 
378 
379  if (!TextUtils.isEmpty(extension)) {
380  object.put(KEY_EXT, extension);
381  }
382  if (!TextUtils.isEmpty(nosTokenSceneKey)) {
383  object.put(KEY_SCENE, nosTokenSceneKey);
384  }
385 
386  if (expire > 0) {
387  object.put(KEY_EXPIRE, expire);
388  }
389 
390  object.put(KEY_FORCE_UPLOAD, forceUpload);
391  save(object);
392 
393  } catch (Exception e) {
394  e.printStackTrace();
395  }
396 
397  return object.toString();
398  }
399 
400  private void fromJson(String attach) {
401  JSONObject json = JSONHelper.parse(attach);
402  if(json == null)
403  {
404  return;
405  }
406  path = JSONHelper.getString(json, KEY_PATH);
407  Uri uri = UriUtils.string2Uri(path);
409  {
410  isUri = true;
411  }
412  md5 = JSONHelper.getString(json, KEY_MD5);
413  url = JSONHelper.getString(json, KEY_URL);
414  displayName = JSONHelper.getString(json, KEY_NAME);
415  size = JSONHelper.getLong(json, KEY_SIZE);
416  extension = JSONHelper.getString(json, KEY_EXT);
417  if(extension != null && extension.startsWith(KEY_DOT))
418  {
419  extension = extension.substring(1);
420  }
421  setNosTokenSceneKey(JSONHelper.getString(json, KEY_SCENE));
422  forceUpload = JSONHelper.getBoolean(json, KEY_FORCE_UPLOAD);
423  expire = JSONHelper.getLong(json, KEY_EXPIRE);
424  load(json);
425  }
426 }
String getUrl()
获取文件在服务器上的下载url。若文件还未上传,返回null
String nosTokenSceneKey
上传文件时用的对token对应的场景,默认NimNosSceneKeyConstant#NIM_DEFAULT_IM
void setExtension(String extension)
设置文件后缀名
boolean setUri(Uri uri)
设置文件uri, 仅支持ContentResolver.SCHEME_FILE类型和ContentResolver.SCHEME_CONTENT类型的uri 仅支持发...
static boolean isFileOrContentUri(String uriString)
判断URI是否为File或者Content类型URI File类型URI表示私有文件 Content类型URI表示共享文件,如图片,音频...
Definition: UriUtils.java:115
static Uri string2Uri(String uriString)
Definition: UriUtils.java:20
带有文件的附件类型的基类 描述文件的相关信息
String getPath()
获取文件本地路径,若文件不存在,返回null
void setForceUpload(boolean forceUpload)
设置文件是否强制重新上传,默认false
String getThumbPath()
获取缩略图文件的本地路径,若文件不存在,返回null
String getDisplayName()
获取文件的显示名。可以和文件名不同,仅用于界面展示
boolean forceUpload
如果服务器存在相同的附件文件,是否强制重新上传 , 默认false
boolean isForceUpload()
文件是否强制重新上传
void setMd5(String md5)
设置文件内容MD5
void setPath(String path)
设置文件路径
void setNosTokenSceneKey(String nosTokenSceneKey)
设置文件上传时的nos scene
String getThumbPathForSave()
获取用于保存缩略图文件的位置
void setDisplayName(String displayName)
设置文件显示名
void setUrl(String url)
设置文件在服务器上的下载url
long getSize()
获取文件大小,单位为byte
String toJson(boolean send)
将消息附件序列化为字符串,存储到消息数据库或发送到服务器。
String getPathForSave()
获取用于保存该文件的位置
String getNosTokenSceneKey()
获取文件上传时的nos scene
void setSize(long size)
设置文件大小,单位为byte