繁体   English   中英

如何将图像从本机应用程序(Expo)上传到 django 服务器

[英]How to upload an image from a react native app (Expo) to a django server

我正在使用 expo 图片选择器让用户将图片上传到 Django 服务器,但我遇到了一个错误,我上传的图片始终为空。 发布请求通过,但图像从未存储但不知何故似乎仍被发送。 从我读过的内容来看,我需要将图像上传为 base64,因此我已将选择器设置为以 base64 格式获取图像,而我一直在使用 uri 进行上传,但我仍然在数据库记录中得到一个空图像字段。

上传网址path('feed/', views.ListCreatePost.as_view(), name="post_feed"),

const [image, setImage] = useState(null);

    useEffect(() => {
        (async () => {
            if (Platform.OS !== 'web') {
                const { status } = await ImagePicker.requestCameraRollPermissionsAsync();
                if (status !== 'granted') {
                    alert('Sorry, we need camera roll permissions in order to make a post!');
                }
            }
        })();
    }, []);

    let postForm = new FormData();

    const makePost = async ()  => {
           try{
               console.log('salvo');
               console.log(image);
               let photo = {
                   uri: image.uri,
                   type: 'image/*',

               };
               console.log('photo');
               console.log(photo);
               postForm.append('user_id', user);
               postForm.append('content', content);
               postForm.append("image", photo);

               let response = await fetch('https://mdrn02.herokuapp.com/api/v1/feed/',
                   {
                       method: 'POST',
                       headers: {
                           Accept: 'application/json',
                           'Content-Type': 'multipart/form-data'
                       },
                       body: postForm
                   });
               console.log('response');
               console.log(response);
               let json = await response.text();

               console.log('response json post');
               console.log(json);


           } catch (error){
               console.log('error posting');
               console.log(error);
               Alert.alert(
                   "Error in fields",
                   "Try again",
                   [{text: 'Close'}]
               );
           }
        };

    const pickImage = async () => {
        let result = await ImagePicker.launchImageLibraryAsync({
            mediaTypes: ImagePicker.MediaTypeOptions.All,
            allowsEditing: true,
            aspect: [4, 3],
            quality: 1,
            base64: true
        });

        console.log(result);

        if (!result.cancelled) {
            setImage(result.uri);
        }
    };

模型

class Post(models.Model):
    user_id = models.ForeignKey('User', on_delete=models.CASCADE)
    time = models.DateTimeField(auto_now_add=True)
    content = models.CharField(max_length=280)
    image = models.ImageField(upload_to='posts/', null=True, blank=True)

看法

class ListCreatePost(generics.ListCreateAPIView):
    queryset = models.Post.objects.all()
    serializer_class = serializers.PostSerializer

序列化器

class PostSerializer(serializers.ModelSerializer):
    class Meta:
        fields = (
            'id',
            'user_id',
            'time',
            'content',
            'image'
        )
        model = models.Post

编辑:我相当肯定错误在于 javascript,以及数据如何发送到服务器。

如果你不介意安装额外的依赖项,我建议你安装优秀的drf-extra-fields包。 这允许您向序列化程序添加 base64 字段(以及许多其他字段):

from drf_extra_fields.fields import Base64ImageField

class PostSerializer(serializers.ModelSerializer):
    image = Base64ImageField()

    class Meta:
        fields = (
            'id',
            'user_id',
            'time',
            'content',
            'image'
        )
        model = models.Post

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM