首页 > 解决方案 > Swift,由于损坏的文件类型隐藏为 JPG,来自 URL 的图像返回 nil

问题描述

我现在在 XCode 和 MacOS/iOS 上遇到了一个大问题。

作为背景,我使用的网站应用程序框架是 laravel,而我用来裁剪个人资料图像的图像编辑器称为图像干预,这是 laravel 的一个非常流行的扩展。

直接跳过——我正在为我的网站创建一个基本的配套应用程序,它与几乎所有其他网站一样,将图像存储在服务器上。这可以通过www.mywebsite.com/storage/基本 URL 到达,并在末尾添加文件名。它还有更多内容,但这些都不是问题。

我已经用过很多次了,因为有多个文件夹用于不同的图像关系。一个文件夹,让我们调用它postimages(所以链接现在www.mywebsite.com/storage/postimages),返回没有问题的图像,到目前为止我已经多次使用它。我在 swift 中用于返回不同图像的代码如下(在我的特定视图中)

func getPic(urlLink: String)-> Image? {
    let baseURL = "https://www.mywebsite.com/storage"
    let url = URL(string: baseURL + urlLink)
    let data = try? Data(contentsOf: url!)
    let image = UIImage(data: data!)
    let image2 = Image(uiImage: (image ?? nil)!)
    return image2
}

因此,这可能写得不好或诸如此类,但这绝对不是任何问题的根源,因此请随心所欲地处理它。无论如何,我再次在多个视图中使用此功能从存储端点上的不同文件夹中检索多个不同的图像。

尝试从不同的端点(特别是我的/profileimages端点)检索图像时出现了这个问题。到目前为止,正如我所说,此功能从未出现过问题。现在,当我尝试使用它来获取个人资料图片时,它会使应用程序崩溃并出现错误

“在展开可选值时意外发现 nil”

在它所在的线周围let data = try? Data(contentsOf: url!)

现在这让我很伤心,因为 URL(当悬停时)显示了正确的 URL 链接,当我将它们输入浏览器时,它返回了有问题的图像。那么为什么图像会以某种方式返回nil?我不知道。

为了增加谜团,我一直在尝试解决这个问题,方法是下载默认的个人资料图像,如果 URL 上没有数据,只需更改函数以返回默认图像(即使应该有,100%的时间)。

当我尝试使用https://www.mywebsite.com/storage/profileimages/blank.jpg链接下载默认个人资料图片时,我尝试将其作为资产添加到 XCode 中,并且它上面有一个大的红色感叹号。尝试使用预览打开它时出现错误“无法打开文件“blank.jpg”。它可能已损坏或使用了预览无法识别的文件格式。” 这令人惊讶,因为在我的 Windows 计算机上,尝试做同样的事情完全没有问题。

我的怀疑是,因为我使用扩展程序将配置文件图像裁剪并调整为正方形大小,所以在保存它的过程中,图像干预损坏了文件,虽然 Windows 将其识别为 JPEG,但 Swift 不会。

我问任何在图像处理方面更有经验的人请帮助我理解这一点,显然显示用户的个人资料图片对于创建网站移动配套应用程序至关重要,现在除了基本的文本标签视图之外,我无法做任何事情没有这个工作如预期。

标签: iosswiftlaravelimageimage-processing

解决方案


我将发布我自己的答案,因为我已经能够解开这个谜团。第一个问题是默认图像确实已损坏。我用 GIMP 做了一个新的,并一直在使用那个。为什么 Windows 仍然可以打开它而 MacOS 不能打开它,这超出了我的理解,也许他们对 JPG 文件的构成有更严格的指导方针,因此文件偷偷溜过 Windows 而不是 Mac,不管是什么问题,显然替换文件解决了我的问题。第二个问题是返回 nil,我发现这是因为我没有对 URL 链接进行百分比编码。一些用户发布的图片中有空格,所以我需要添加百分比编码才能使其工作(出于某种原因)。这两种解决方案的结合消除了我所面临的整个问题,并且我不再有返回零的图片。


推荐阅读