Django文件上传保存-文件损坏

如下,前端用form-data传上来的文件,后端用如下代码保存。运行没问题,但打开保存的文件是损坏的,打不开。不知道问题出在哪
python: 3.9.13
django: 3.2
环境: windows


def upload_file(request):
    if request.method == "POST":  # 请求方法为POST时,进行处理
        file = request.FILES['myfile']
        print(file)
        path = "/output/%s" % file.name
        with open(path,'wb+') as f:
            for i in file.chunks():
                f.write(i)
        f.close()
  return HttpResponse("upload over!")

该回答通过自己思路及引用到GPTᴼᴾᴱᴺᴬᴵ搜索,得到内容具体如下:

这个问题可能与文件保存路径有关。建议您先确认文件保存路径是否正确,如果路径正确但文件仍然损坏,则可能是写入文件时的编码问题。以下是一个可能的修改方法,将写入文件时的编码改为utf-8,具体修改后的代码如下。
import os

def upload_file(request):
    if request.method == "POST":
        file = request.FILES['myfile']
        path = os.path.join("/output", file.name)
        with open(path, 'wb') as f:
            for chunk in file.chunks():
                f.write(chunk)
        return HttpResponse("upload over!")

此外,如果您需要在django中保存上传的文件,建议使用Django提供的内置视图和函数,例如django.views.generic.edit.CreateView和django.core.files.storage.default_storage.save。这些函数具有更好的稳定性和可扩展性,可以帮助您更好地处理文件上传。


如果以上回答对您有所帮助,点击一下采纳该答案~谢谢

with open(path,wb+,encoding="utf-8")
试试

这个问题可能是由于写入文件时的编码问题导致的,或者是由于写入方式不正确导致的。

可以尝试使用二进制模式打开文件,以确保正确的写入方式。修改代码如下:

def upload_file(request):
    if request.method == "POST":  
        file = request.FILES['myfile']
        print(file)
        path = "/output/%s" % file.name
        with open(path, 'wb+') as f:  # 使用二进制模式打开文件
            for i in file.chunks():
                f.write(i)
        f.close()
        return HttpResponse("upload over!")

此外,也可以尝试将文件内容编码为 base64 格式进行保存,这样可以确保文件内容不会被损坏。修改代码如下:

import base64

def upload_file(request):
    if request.method == "POST":  
        file = request.FILES['myfile']
        print(file)
        path = "/output/%s" % file.name
        with open(path, 'w+') as f:  # 使用文本模式打开文件
            encoded_data = base64.b64encode(file.read())
            f.write(encoded_data.decode('utf-8'))
        f.close()
        return HttpResponse("upload over!")

这样写入的文件可以通过解码 base64 字符串来获取原始文件内容。

问题可能出在文件保存路径上。你将文件保存到了"/output/"目录下,但是这个目录可能不存在,或者你没有权限在这个目录下创建文件。

可以尝试修改文件保存路径为当前项目的根目录下的"output/"目录(如果没有就创建一个),例如:


```python
import os

def upload_file(request):
    if request.method == "POST":
        file = request.FILES['myfile']
        path = os.path.join(os.getcwd(), 'output', file.name)  # 获取当前目录,然后拼接出保存路径
        with open(path, 'wb+') as f:
            for i in file.chunks():
                f.write(i)
        return HttpResponse("upload over!")


```
同时也要确保你有足够的权限在当前目录下创建文件。

Chatgpt辅助 可能是因为你在写文件之前没有将文件指针移到文件的开头,导致文件保存的时候内容不完整或者文件损坏。

你可以尝试在写文件之前添加一行代码,将文件指针移到文件开头,如下所示:

def upload_file(request):
    if request.method == "POST":  # 请求方法为POST时,进行处理
        file = request.FILES['myfile']
        print(file)
        path = "/output/%s" % file.name
        with open(path, 'wb+') as f:
            f.seek(0)  # 将文件指针移到文件开头
            for i in file.chunks():
                f.write(i)
        f.close()


另外,你也可以尝试使用Django内置的default_storage来保存文件,它可以自动处理文件名和文件路径,并且可以避免一些文件保存的问题,如下所示:


from django.core.files.storage import default_storage

def upload_file(request):
    if request.method == "POST":  # 请求方法为POST时,进行处理
        file = request.FILES['myfile']
        print(file)
        path = default_storage.save('/output/%s' % file.name, file)

如果你仍然遇到问题,请提供更多的信息,例如上传的文件类型、大小等,以便更好地帮助你解决问题。

以下答案由GPT-3.5大模型与博主波罗歌共同编写:
这个问题可能是由于文件保存时缺少文件类型导致的。另外,您应该不需要使用 f.close(),因为您使用了 with open() 语句,它会自动关闭文件。

以下是保存文件的标准方法:

def upload_file(request):
    if request.method == "POST":
        file = request.FILES['myfile']
        path = "/output/%s" % file.name
        # 获取文件的类型
        content_type = file.content_type.split('/')[1]
        # 如果类型不是jpg、png等常见的图片类型,强制设置为txt文件类型
        if content_type not in ['jpg', 'png', 'gif']:
            content_type = 'txt'
        # 将文件类型添加到文件名中
        path = "%s.%s" % (path, content_type)

        with open(path,'wb+') as f:
            for i in file.chunks():
                f.write(i)

        return HttpResponse("upload over!")

在上述代码中,我们使用 content_type 变量获取上传文件的类型,然后将其添加到文件名中。如果文件类型不是通常的图像类型,则将其默认设置为“txt”。最后,我们使用 with open() 语句打开文件,将字节流写入它,最后返回 HttpResponse。
如果我的回答解决了您的问题,请采纳!


这种情况可能是因为上传的文件在传输过程中发生了错误,导致文件内容损坏。另外,也有可能是文件存储路径不正确导致的问题。

你可以尝试以下几个方法来解决这个问题:

尝试打印上传的文件的大小和内容,以确保它们没有被修改或损坏。你可以在文件保存之前添加以下代码:
print("file size:", file.size)
print("file content:", file.read())

确认文件保存路径是正确的。可以使用绝对路径来保存文件,如:
import os
from django.conf import settings

path = os.path.join(settings.BASE_DIR, 'output', file.name)

尝试使用二进制方式打开文件进行保存。在 with open(path,'wb+') as f: 中,wb+ 表示二进制方式打开文件进行读写。如果你的文件是二进制格式的,使用二进制方式进行读写可以确保文件内容不会被修改。
该回答引用ChatGPT
这个问题可能是由于文件上传时没有正确地设置文件的编码方式导致的。在Django中,文件上传时需要设置文件的编码方式,否则可能会出现文件损坏的情况。
可以尝试在打开文件时指定编码方式,例如:

with open(path, 'wb+') as f:
for i in file.chunks():
f.write(i.decode('utf-8'))

另外,还可以尝试使用Django自带的文件存储系统来保存文件,例如:

from django.core.files.storage import FileSystemStorage
def upload_file(request):
if request.method == "POST":
file = request.FILES['myfile']
fs = FileSystemStorage()
filename = fs.save(file.name, file)
uploaded_file_url = fs.url(filename)
return HttpResponse("upload over!")

这样可以确保文件上传和保存的正确性。

可能是由于保存文件的路径不正确或者写入方式有误,导致文件损坏无法打开。可以尝试以下方法:

  1. 检查保存文件的路径是否存在或者是否正确。可以尝试将文件保存在其他目录下,比如桌面或者项目根目录下,看看是否依然存在损坏的问题。
  1. 尝试使用二进制模式打开文件并写入数据,即将 with open(path,'wb+') as f: 改为 with open(path,'wb') as f:。这样可以确保以二进制模式打开文件,避免编码问题造成的损坏。
  1. 尝试使用 Django 自带的文件存储类,比如 FileSystemStorage 来保存文件。示例代码如下:
from django.core.files.storage import FileSystemStorage

def upload_file(request):
    if request.method == "POST":  # 请求方法为POST时,进行处理
        file = request.FILES['myfile']
        print(file)
        fs = FileSystemStorage()
        filename = fs.save(file.name, file)
        return HttpResponse("upload over!")

这样可以避免手动打开文件并写入数据的操作,更加简洁、安全、易于维护。