(Swift) 将图片上传到后端无法正常工作并在 (Postman) & (Admin Page) 中工作

(Swift) upload Image to backend not working and Worked in (Postman) & (Admin Page)

正在尝试将图像从 Swift APP 上传到后端

在管理页面上测试工作正常我可以上传图片。

在 Postman 上测试过,它工作正常,我可以上传图片。

当我尝试从 swift 上传时,我得到 invalid_image

我正在使用 UIImage 并使用 pngData 进行转换并将其发送到 URLSession 中: param["src"] 包含 UIImage

var request = URLRequest(url: URL(string: ServerURL)!,timeoutInterval: Double.infinity)
    let boundary = "Boundary-\(UUID().uuidString)"
    request.addValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type")

    request.httpMethod = "PUT"
var body = ""
for param in parameters {
        if param["disabled"] == nil {
            let paramName = param["key"]!
            body += "--\(boundary)\r\n"
            body += "Content-Disposition: form-data; name=\"\(paramName)\""
            if param["contentType"] != nil {
                body += "\r\nContent-Type: \(param["contentType"] as! String)"
            }
            let paramType = param["type"] as! String
            if paramType == "text" {
                let paramValue = param["value"] as! String
                body += "\r\n\r\n\(paramValue)\r\n"
            } else {
            let paramSrc = param["src"] as! UIImage
            let fileData = (String(data: fileData, encoding: .utf8) ?? "Converting to UTF8 Fail") as String
            body += "; filename=\"myImg.png\"\r\n"
            body += "Content-Type: image/png\r\n\r\n\(fileData)\r\n"
                        

检查了 paramSrc 及其内容图像,但 fileData 为零

我试过了:

let fileData = paramSrc.pngData()! as NSData

并且 fileData 包含的数据不是零,但仍然得到

ErrorDetail(string='Upload a valid image. The file you uploaded was either not an image or a corrupted image.', code='invalid_image')

解决它(将其作为数据发送):​​

感谢@pastre 帮助找出问题所在

我在将图像上传到 REST Framework API 时遇到了类似的问题,并通过 :

修复了它

views.py

from rest_framework.parsers import FormParser, MultiPartParser


class ClassName(APIView):
    parser_classes = (MultiPartParser, FormParser, )

    def put(self, request, format=None):
        instance = request.user
        serializer = ClassNameSerializer(instance, data=request.data)
        
        if not serializer.is_valid(raise_exception=True):
            return Response({
                "error": serializer.errors
            })
        serializer.save()

        return Response({
            "detail": "Model object updated",
        })

serializers.py


class ClassNameSerializer(serializers.ModelSerializer):

    class Meta:
        model = ClassName
        fields = ['profile_image', 'full_name', 'address', 'email', 'address']

    def update(self, instance, validated_data):

        if 'profile_image' in validated_data.keys():
            instance.profile_image = validated_data['profile_image']
        if 'full_name' in validated_data.keys():
            instance.full_name = validated_data['full_name']
        if 'email' in validated_data.keys():
            instance.email = validated_data['email'].lower()
        if 'address' in validated_data.keys():
            instance.address = validated_data['address']


        instance.save()
        return instance

正如你所看到的,我没有在序列化程序中做太多文件处理,所以在你的情况下添加这些并重试:

views.py

from rest_framework.parsers import FormParser, MultiPartParser

class PUser(APIView):
    parser_classes = (MultiPartParser, FormParser, )
    def patch(self, request, format=None):

请尝试看看它是否适合你。

如果有人遇到同样的问题,我就是这样解决的

我只是将正文从字符串更改为数据

var body = Data()

然后

 if let fileData = paramSrc.pngData() {
                        body.append("; filename=\"blah.png\"\r\n".data(using: .utf8)!)
                        body.append("Content-Type: \"content-type header\"\r\n\r\n".data(using: .utf8)!)
                        body.append(fileData)
                    }