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