Python的Django-rest-framework框架获取Http上传文件保存后文件内容不对

获取上传文件后,将上传文件流写入到服务器文件中后.文件内容多了http流相关信息

--X-INSOMNIA-BOUNDARY
Content-Disposition: form-data; name="file"; filename="a.txt"
Content-Type: text/plain



Hello




--X-INSOMNIA-BOUNDARY--

应该怎么获取上传文件信息保存的时候,只会是原文件.


补充下我的源代码:


class UploadView(APIView):
    '''
    上传文件专用
    '''

    parser_classes = (FileUploadParser, )

    def put(self, request, filename, format = None):
        '''
        上传
        '''

        up_file = request.data['file']
        base_dir = settings.BASE_DIR

        print filename


        storage = base_dir + '/' + 'storage/'
        new_file = storage + up_file.name

        with open(new_file, 'wb+') as destination:
            for chunk in up_file.chunks():
                destination.write(chunk)

            destination.close()

        # up_file.new_file('file', new_file, up_file.content_type, up_file.size, up_file.charset, up_file.content_type_extra)


        # with open(new_file, 'wb+') as destination:
        #     for line in up_file:
        #         destination.write(line)
        #     destination.close()
        #     # destination.write(up_file.multiple_chunks())
        #     # destination.close()

        return Response(up_file.name, status.HTTP_201_CREATED)
阅读 6.7k
1 个回答

看你的保存内容应该是使用类似BaseHTTPServer这种python自带的类完成的上传服务器。
https://github.com/smilejay/p...
如果是这样的话,那些http流的相关信息是没有什么好的办法的,只能自己通过类似readline的方式,一行一行的读取,并且手动去除http相关信息。
所幸这些都是http信息都是有相关标准的,例如 1-4 行为http信息, 5-(-2)行为上传信息,最后一行为http信息(这只是随便举得一个例子)
所以想要通过这种方式来完成上传文件的话,需要自己去研究下rfc标准:
http://www.ietf.org/rfc/rfc1867
http://www.vivtek.com/rfc1867...

但是看你标签上是有django的,所以应该会更简单省事些的方式,就是使用djangorequest.FILES了。
参考地址:
https://docs.djangoproject.co...
示例:

# 获取文件名
request.FILES['filename'].name
# 获取全部文件
for filename, file in request.FILES.iteritems():
    name = request.FILES[filename].name
    # 文件内容(这个不确定,请自行查看文档)
    file.readall()
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题