iOS 11从Dropbox拖拽PDF时如何获取原文件名?
解决DropBox拖放PDF获取原文件名的方法
我之前也碰到过类似的问题,DropBox的拖放确实不会直接返回可访问的常规文件URL,但其实可以通过UIDropItem的itemProvider来轻松拿到原文件名,甚至文件数据,具体可以这么操作:
1. 从拖放会话中拿到NSItemProvider
在你的拖放代理方法(比如dropInteraction(_:performDrop:))里,先获取每个拖放项对应的NSItemProvider实例:
func dropInteraction(_ interaction: UIDropInteraction, performDrop session: UIDropSession) { for item in session.items { let itemProvider = item.itemProvider // 接下来处理这个itemProvider } }
2. 两种方式获取原文件名
DropBox的拖放项会携带足够的元数据,你可以优先尝试下面的方法:
方法一:直接获取文件URL(部分场景可用)
如果DropBox允许返回文件URL,你可以通过loadFileRepresentation拿到URL,再提取文件名:
if itemProvider.hasItemConformingToTypeIdentifier(kUTTypeFileURL as String) { itemProvider.loadFileRepresentation(forTypeIdentifier: kUTTypeFileURL as String) { url, error in guard let fileURL = url, error == nil else { return } // 从URL中提取原文件名 let fileName = fileURL.lastPathComponent DispatchQueue.main.async { // 切回主线程处理UI或业务逻辑 print("获取到文件名:\(fileName)") } } }
方法二:通过suggestedName直接获取(最可靠)
如果方法一失败,别担心,NSItemProvider的suggestedName属性几乎是所有第三方应用(包括DropBox)都会正确填充的字段,直接拿就好:
if itemProvider.hasItemConformingToTypeIdentifier(kUTTypePDF as String) { itemProvider.loadItem(forTypeIdentifier: kUTTypePDF as String, options: nil) { (data, error) in guard let pdfData = data as? Data, error == nil else { return } // 直接从itemProvider拿到原文件名,默认值做兜底 let fileName = itemProvider.suggestedName ?? "未知文件名.pdf" DispatchQueue.main.async { print("获取到文件名:\(fileName)") // 同时可以用pdfData处理PDF内容 } } }
3. 关键注意事项
- 线程问题:
loadFileRepresentation和loadItem都是在后台线程异步执行的,处理完后一定要切回主线程更新UI或者执行后续业务逻辑。 - 记得导入
MobileCoreServices框架,这样才能使用kUTTypePDF、kUTTypeFileURL这些类型常量。 - 如果你的
DragDropFile类原来只处理URL,可以修改它支持接收Data和文件名参数,这样不管是Files应用还是DropBox的拖放,都能统一处理。
内容的提问来源于stack exchange,提问作者user3425784
相关产品推荐
相关产品推荐

