如何将图像从React Native应用(Expo)上传到Django服务器

时间:2020-10-20 19:26:41

标签: javascript django react-native expo

我正在使用expo图片选择器让用户将图片上传到Django服务器,但是我遇到一个错误,即我上传的图片始终为空。发布请求通过,但是图像从不存储,但似乎仍然以某种方式发送。从我的阅读中,我需要将图像上传为base64,因此我将选择器设置为在base64中拍摄图像,而我一直在使用uri进行上传,但在数据库记录中仍然会得到一个空图像字段。 / p>

上传网址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,以及数据如何发送到服务器。

1 个答案:

答案 0 :(得分:0)

如果您不介意安装其他依赖项,建议您安装出色的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