makliu 发表于 2024-5-27 16:17:29

django 下载图片问题

下载图片的方法 def download_to_excel_pic(datas: list, fields: list, pic_col: int,
                        pic_dir='images',
                        filename='eg', *args, **kwargs):

   
    pic_path = os.path.join(settings.STATIC_ROOT, pic_dir)
    pic_col_name = string.ascii_uppercase

    wb = Workbook()
    ws = wb.active
    ws.append(fields)

    for idx, item in enumerate(datas):
      row_list =

      row_list.insert(pic_col - 1, '')
      ws.append(row_list)
      ws.row_dimensions.height = 40
      
      pic_name = str(row_list) + '.jpg'

      img_path = os.path.join(pic_path, pic_name)

      try:
            img = Image(img_path)
            img.width = 40
            img.height = 40
            ws.add_image(img, f'{pic_col_name}{idx + 2}')
      except Exception as e:
            ws = '图片不存在'
         
    excel_file = BytesIO()
    wb.save(excel_file)
    excel_file.seek(0)

    response = HttpResponse(content=excel_file.getvalue(),
                            content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')
    response['Content-Disposition'] = f'attachment; filename="{filename}.xlsx"'
    return response


上面代码是 一个 django 下载图片到excel的 方法;   
在开发环境时,能正常下载图片,;   
在正式环境后,却下载不了图片,图片能正常在页面显示 的。
img_path是图片的绝对路径   ,检查过绝对 路径是正确的。
为什么会出现这种情况,   
或者还有什么方法 可以把图片 下载到excel 中 ???

FishC 发表于 2024-5-27 16:17:53

在正式环境中无法下载图片的问题可能是由于权限设置不正确导致的。在开发环境中,您可能有足够的权限读取和写入文件,但在正式环境中,您可能需要确保服务器(如Apache或Nginx)具有足够的权限来访问和写入目标文件夹。

您可以尝试以下几个步骤来解决这个问题:

1. 确认图片文件夹的权限:确保目标图片文件夹具有足够的权限,以便服务器可以读取和写入其中的文件。您可以使用命令行工具(如chmod命令)来更改文件夹的权限。

2. 确认图片路径是否正确:仔细检查图片的绝对路径是否正确,并且确保路径中的大小写与实际文件系统中的一致。

3. 检查服务器配置:如果您使用的是Apache或Nginx等服务器,请确保您的服务器配置文件中有适当的设置来允许访问和下载图片文件。您可能需要添加类似于以下示例的配置:

对于Apache:

<Directory /path/to/pic_dir>
    Options Indexes FollowSymLinks
    AllowOverride None
    Require all granted
</Directory>

对于Nginx:

location /pic_dir/ {
    alias /path/to/pic_dir/;
    autoindex on;
}

请注意,上述示例中的`/path/to/pic_dir`应替换为您实际的图片文件夹路径。

如果进行了上述步骤并且仍然无法下载图片,您还可以尝试以下方法来将图片下载到Excel中:

1. 使用Python的PIL库(Pillow)将图片直接插入Excel单元格中,而不是作为附件下载。您可以使用`openpyxl`库来创建Excel文件,并使用`PIL`库的`Image`模块将图片插入单元格中。以下是一个示例代码:

from openpyxl import Workbook
from openpyxl.drawing.image import Image
from PIL import Image as PILImage

def download_to_excel_pic(datas: list, fields: list, pic_col: int, filename='eg'):
    wb = Workbook()
    ws = wb.active
    ws.append(fields)

    for idx, item in enumerate(datas):
      row_list = []
      # 将其他数据添加到row_list中

      pic_name = str(row_list) + '.jpg'
      img_path = '/path/to/pic_dir/' + pic_name

      try:
            img = PILImage.open(img_path)
            img.thumbnail((40, 40))# 调整图片尺寸
            img = Image(img)
            img.width = 40
            img.height = 40
            ws.add_image(img, f'A{idx + 2}')# 在A列插入图片
      except Exception as e:
            ws.cell(row=idx + 2, column=pic_col).value = '图片不存在'

    excel_file = BytesIO()
    wb.save(excel_file)
    excel_file.seek(0)

    response = HttpResponse(content=excel_file.getvalue(),
                            content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')
    response['Content-Disposition'] = f'attachment; filename="{filename}.xlsx"'
    return response

这样,图片将直接嵌入到Excel单元格中,而不是作为附件下载。

希望以上解决方案能帮助您解决问题!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

makliu 发表于 2024-5-27 16:20:19

FishC 发表于 2024-5-27 16:17
在正式环境中无法下载图片的问题可能是由于权限设置不正确导致的。在开发环境中,您可能有足够的权限读取和 ...

用的是IIS

FishC 发表于 2024-5-27 16:20:44

makliu 发表于 2024-05-27 16:20
用的是IIS

如果您使用的是IIS作为Web服务器,那么您需要确保IIS具有正确的权限来访问和写入目标文件夹。以下是一些可能的解决方案:

1. 确认应用程序池的身份验证用户:在IIS中,每个应用程序池都有一个关联的身份验证用户。您可以通过以下步骤检查并更改身份验证用户:

   a. 打开IIS管理器,选择您的站点。
   
   b. 找到您的应用程序池,右键单击并选择"高级设置"。
   
   c. 在"高级设置"对话框中,找到"身份验证"部分,并记录下当前的身份验证用户。
   
   d. 关闭"高级设置"对话框,然后在IIS管理器中的左侧面板选择"应用程序池"。
   
   e. 找到您的应用程序池,右键单击并选择"属性"。
   
   f. 在"属性"窗口中,选择"身份"选项卡,并更改身份验证用户为具有正确权限的用户(例如,具有读取和写入目标文件夹权限的用户)。
   
   g. 保存更改并重新启动应用程序池。

2. 确认目标文件夹的权限:确保目标文件夹具有足够的权限,以便IIS可以读取和写入其中的文件。您可以使用Windows资源管理器或命令行工具(如icacls命令)来更改文件夹的权限。

   a. 在Windows资源管理器中,找到目标文件夹,右键单击并选择"属性"。
   
   b. 在"安全"选项卡中,确保IIS的身份验证用户具有适当的权限(例如,"完全控制"或"读取和写入"权限)。
   
   c. 如果IIS的身份验证用户不存在于权限列表中,请点击"编辑"按钮,然后点击"添加"按钮,输入IIS的身份验证用户,并为其分配适当的权限。

3. 检查IIS配置:确保您的IIS配置中允许访问和下载图片文件。您可以打开IIS管理器,选择您的站点,然后找到"处理程序映射"选项,确保与图片相关的MIME类型(例如,image/jpeg)被正确地映射到适当的处理程序。

希望以上解决方案能帮助您解决问题!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

makliu 发表于 2024-5-27 16:35:57

FishC 发表于 2024-5-27 16:17
在正式环境中无法下载图片的问题可能是由于权限设置不正确导致的。在开发环境中,您可能有足够的权限读取和 ...

img_path = '/path/to/pic_dir/' + pic_name    这里 是用 正式环境中收集后的 静态目录 绝对路径吗? 如
C:\inetpub\wwwroot\my_demo2\static_collected\images

FishC 发表于 2024-5-27 16:36:07

makliu 发表于 2024-05-27 16:35
img_path = '/path/to/pic_dir/' + pic_name    这里...

对于在IIS中部署的Django项目,静态文件的绝对路径应该是`settings.STATIC_ROOT`与图片相对路径的组合。

根据您提供的信息,假设`settings.STATIC_ROOT`的值为`C:\inetpub\wwwroot\my_demo2\static_collected`,图片相对路径为`images`,那么你可以这样构建图片路径:
img_path = os.path.join(settings.STATIC_ROOT, 'images', pic_name)

以上代码将生成类似于`C:\inetpub\wwwroot\my_demo2\static_collected\images\pic_name.jpg`的图片绝对路径。

希望这个解释对您有所帮助!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: django 下载图片问题