无法将“文件名”的对象转换为“str”

问题描述 投票:0回答:1

我正在开发应用程序,其中 react-native 作为前端,django-rest-framework 作为后端。从前端我在后端使用 formdata 发送图像。但是我收到此错误无法将对象转换为“文件名”的“str”。

前端代码

const estPrice = async () => {
        const formData = new FormData();
        console.log(Page1)
        formData.append("book_page1", {
            name: "page1.jpg",
            uri: Page1,
            type: "image/jpg",
        });
        formData.append("book_page2", {
            name: "page2.jpg",
            uri: Page2,
            type: "image/jpg",
        });
        formData.append("book_page3", {
            name: "page3.jpg",
            uri: Page3,
            type: "image/jpg",
        });

        try {
            const result = await authAxios.post("/sell/estprice", formData);
            console.log(result)
        } catch (error) {
            console.log(error);
        }
};

后台代码

class BookEstimatedPriceView(GenericAPIView):
    def post(self, request):
        data = request.data
        print(data)
        img1 = data.get('book_page1', '');
        img2 = data.get('book_page2', '');
        img3 = data.get('book_page3', '');
        print(img1)

        def rgb_to_hex(rgb_color):
            hex_color = "#"
            for i in rgb_color:
                i = int(i)
                hex_color += ("{:02x}".format(i))
            return hex_color

        # img1 = 'C:/Users/Aditya Pandit/Desktop/Image/Aditya@123/photo1.jpg'
        # img2 = 'C:/Users/Aditya Pandit/Desktop/Image/Aditya@123/photo2.jpg'
        # img3 = 'C:/Users/Aditya Pandit/Desktop/Image/Aditya@123/photo3.jpg'

        img1 = cv2.imread(img1)
        img2 = cv2.imread(img2)
        img3 = cv2.imread(img3)

        img1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
        img2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)
        img3 = cv2.cvtColor(img3, cv2.COLOR_BGR2GRAY)

        n_clusters = 1
       
        list_hex = []
        img_list = [img1, img2, img3]
        for item in img_list:
            kmeans = KMeans(n_clusters)
            kmeans.fit(item)
            colors = kmeans.cluster_centers_
            labels = kmeans.labels_

            label_count = [0 for i in range(n_clusters)]

            for ele in labels:
                label_count[ele] += 1
            index_color = label_count.index(max(label_count))
        

            dict_colour_percen = {}
            print
            for index, ele in enumerate(label_count):
                #print(str(ele)+' labels with pixel value -> '),
                hex_color = rgb_to_hex(colors[index])
                #print(hex_color,)
                list_hex.append(hex_color)
                color_percen = float(ele)/len(labels)*100
                print('Percentage ->'+str(color_percen))
                dict_colour_percen[hex_color] = color_percen
                print()
            plt.show()
            print()

        list_first_index = []
        for items in list_hex:
            list_first_index.append(items[1:2])
        print(list_first_index)
        price = 200
        estimated_price = 0
        list_per = []
        for items in list_first_index:
            #for color in list_color_palette:
            if(items=='0' or items=='1'):
                list_per.append(20)
            if(items=='2'):
                list_per.append(26.3)
            if(items=='3'):
                list_per.append(32.6)
            if(items=='4'):
                list_per.append(38.9)
            if(items=='5'):
                list_per.append(45.2)
            if(items=='6'):
                list_per.append(51.5)
            if(items=='7'):
                list_per.append(57.8)
            if(items=='8'):
                list_per.append(64.1)
            if(items=='9'):
                list_per.append(70.4)
            if(items=='a'):
                list_per.append(76.7)
            if(items=='b'):
                list_per.append(83)
            if(items=='c'):
                list_per.append(89.3)
            if(items=='d'):
                list_per.append(90)
            if(items=='e'):
                list_per.append(90)
            if(items=='f'):
                list_per.append(90)
        print(list_per)
        sum = 0
        for item in list_per:
            sum+=item
        avg_per=sum/len(list_per)
        print(avg_per)
        estimated_price = price*(avg_per/100)
        print(estimated_price)
        

        data = {
            'est_price': estimated_price
        }

        return Response(data, status=status.HTTP_200_OK);

错误

Internal Server Error: /api/sell/estprice
Traceback (most recent call last):
  File "C:\Users\Aditya Pandit\.virtualenvs\bookmart-ySyK5Yky\Lib\site-packages\django\core\handlers\exception.py", line 55, in inner
    response = get_response(request)
               ^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Aditya Pandit\.virtualenvs\bookmart-ySyK5Yky\Lib\site-packages\django\core\handlers\base.py", line 197, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Aditya Pandit\.virtualenvs\bookmart-ySyK5Yky\Lib\site-packages\django\views\decorators\csrf.py", line 56, in wrapper_view
    return view_func(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Aditya Pandit\.virtualenvs\bookmart-ySyK5Yky\Lib\site-packages\django\views\generic\base.py", line 104, in view
    return self.dispatch(request, *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Aditya Pandit\.virtualenvs\bookmart-ySyK5Yky\Lib\site-packages\rest_framework\views.py", line 509, in dispatch
    response = self.handle_exception(exc)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Aditya Pandit\.virtualenvs\bookmart-ySyK5Yky\Lib\site-packages\rest_framework\views.py", line 469, in handle_exception
    self.raise_uncaught_exception(exc)
  File "C:\Users\Aditya Pandit\.virtualenvs\bookmart-ySyK5Yky\Lib\site-packages\rest_framework\views.py", line 480, in raise_uncaught_exception
    raise exc
  File "C:\Users\Aditya Pandit\.virtualenvs\bookmart-ySyK5Yky\Lib\site-packages\rest_framework\views.py", line 506, in dispatch
    response = handler(request, *args, **kwargs)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Aditya Pandit\Desktop\bookmart\bookmart\sell\views.py", line 70, in post
    img1 = cv2.imread(img1)
           ^^^^^^^^^^^^^^^^
TypeError: Can't convert object to 'str' for 'filename'

我期待从前端获取图像,在后端处理并获得响应。对于绝对路径,api 工作正常。但是,对于来自前端的图像,它给出了错误。

django react-native django-rest-framework cv2 imread
1个回答
0
投票

你需要使用

request.FILES.get('img*')

© www.soinside.com 2019 - 2024. All rights reserved.