(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)
}
正在尝试将图像从 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)
}