ios - 从互联网下载照片的功能不起作用
问题描述
我有这个代码:
struct MyPackageData: Codable {
let versionDate: String
let photosSizes, packshotsSizes, inspirationsPhotoSizes, conceptsSlidesSizes: [String: Int]
let tipsSlidesSizes, leafletsSlidesSizes, leafletsPdfSlidesSizes: [String: Int]
}
func downloadImagesTipsSlides(toDownloads: MyPackageData, savedURL: String){
do {
let dateToParse = toDownloads.tipsSlidesSizes
for photo in dateToParse {
let fileNamePhoto = photo.key
let checkLocalCopyFileIsAvailable = checkLocalFileCopyIsAvailable(fileName: (AppGlobalManager.sharedManager.loggedUser?.selectedLanguage)! + "/" + FileFolders.GET_TIPS_SLIDES.rawValue + "/" + "\(fileNamePhoto)")
if checkLocalCopyFileIsAvailable == false {
let productImageUrl : URL = URL(string: "\(ApiConstans.fullPath)?action=\(FileFolders.GET_TIPS_SLIDES.rawValue)&name=\(fileNamePhoto)&resolution=FHD&lang=" + (AppGlobalManager.sharedManager.loggedUser?.getUserLanguageUrl())!)!
remoteResource(at: productImageUrl, fileSize: photo.value) { (isImage) in
if isImage == false {
}
if isImage == true {
self.saveDownloadImages(fileInternetUrl: productImageUrl, fileName: "\(fileNamePhoto)", savedURL: savedURL)
}
}
} else {
print("I have photo \(fileNamePhoto) - nie robię nic")
}
}
}
}
func remoteResource(at url: URL, fileSize: Int, isImage: @escaping ((Bool) -> Void)) {
let request = URLRequest(url: url)
debugPrint(request)
let task = URLSession.shared.dataTask(with: request) { (data, response, error) in
if let data = data, let image = UIImage(data: data) {
if let _ = UIImageJPEGRepresentation(image, 1.0) {
isImage(true)
} else if let _ = UIImagePNGRepresentation(image) {
isImage(true)
} else {
isImage(false)
}
} else {
isImage(false)
}
isImage(true) // remove
}
task.resume()
}
func saveDownloadImages(fileInternetUrl: URL, fileName: String, savedURL: String){
let documentsDir = FileManager.default.urls(for: .applicationSupportDirectory, in: .userDomainMask).first!
let fullImagesPath = documentsDir.appendingPathComponent(savedURL)
let cms = ServerConnect()
print("XX \(fullImagesPath)")
cms.downloadedFileFromInternet(fileInternetUrl: fileInternetUrl, saveToPath: fullImagesPath, fileName: fileName, completion: { (data) in
switch data {
case .succes:
print("")
case .error(let error):
//self.errorLoginMessage(txt: "MainView - Error 110: Problem with download images. \(error)", title: "Blad".localized())
print("")
break
}
})
}
当我出错时:线程 7:致命错误:在展开可选值时意外发现 nil
排队:
let productImageUrl : URL = URL(string: "\(ApiConstans.fullPath)?action=\(FileFolders.GET_TIPS_SLIDES.rawValue)&name=\(fileNamePhoto)&resolution=FHD&lang=" + (AppGlobalManager.sharedManager.loggedUser?.getUserLanguageUrl())!)!
我的调试控制台:
(来源:home.pl)
我的文件名有问题: - wolność ogłoszenia.jpg - Wydajność wagowa___004.jpg
等等
使用正常名称的文件名:1.jpg、139485.jpg、14383.jpg - 此代码正常工作。
上面的代码是从互联网上下载照片并将它们保存到设备的内存中。没有特殊名称的文件可以正常工作。
我无法更改服务器上的文件名。
有谁知道如何修理它?
解决方案
不要强行打开东西,你会节省很多常见的崩溃。
let productImageUrl : URL = URL(string: "\(ApiConstans.fullPath)?action=\(FileFolders.GET_TIPS_SLIDES.rawValue)&name=\(fileNamePhoto)&resolution=FHD&lang=" + (AppGlobalManager.sharedManager.loggedUser?.getUserLanguageUrl())!)!
这String
不是一个URL
. 展开使用guard let/ if let
:
guard let languageUrl = AppGlobalManager.sharedManager.loggedUser?.getUserLanguageUrl(), let urlString = "\(ApiConstans.fullPath)?action=\(FileFolders.GET_TIPS_SLIDES.rawValue)&name=\(fileNamePhoto)&resolution=FHD&lang=\(languageUrl)".addingPercentEncoding(withAllowedCharacters: .urlFragmentAllowed), let productImageUrl = URL(string: urlString) else {
print("Problem in converting string to URL")
return
}
print(productImageUrl)
简而言之,您String
应该"http://" or "https://"
在开始时将其转换String
为URL
. 对于文档目录中的某些内容,您可以添加"file://"
.
推荐阅读
- docker - bazel 和 docker 图像:@go_image_base//image 的意义何在?
- arrays - 一种将numpy数组的某些列固定为整数而其余为浮点数的方法?
- opencv - OpenCV 渲染低质量视频
- c# - 如何在 Prism 中将服务注册为瞬态
- docker - 从 docker env 下的 python django 到本地机器上的 iis 的请求(在 docker 之外)
- asp.net - dotNetCore Blazor加载index.razor页面时如何自动执行js事件(非点击事件)
- networking - 无法通过 SSH 连接到 Google Cloud Platform 上的 VM 实例
- javascript - 将输入框 2 文本更改为输入框 1 Angular 2 中的更改?
- json - Spark 读取带有请求参数的 JSON
- javascript - 在下拉菜单中显示可用房间的替代方法?