图片以字节数组的形式存到数据库

本文介绍了一个使用ASP.NET实现文件上传功能的例子,并演示了如何将上传的文件存储到数据库中。具体包括:默认页面的布局代码、按钮点击事件处理、文件数据插入数据库的方法以及从数据库读取文件数据并返回的过程。

default.aspx

 

 

<%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>无标题页</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <br />
        <asp:FileUpload ID="FileUpload1" runat="server" />
        <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Button" /><br />
        <br />
        <asp:Label ID="Label1" runat="server"></asp:Label><br />
        <br />
   
    </div>
    </form>
</body>
</html>

 

default.aspx.cs

 

 

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;


using System.Data.SqlClient;


public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
      

    }
    protected void insert(byte[] b)
    {
        string connString = "server=.;database=pubs;uid=sa;pwd=";
        using (SqlConnection conn = new SqlConnection(connString))
        {
            conn.Open();
            using (SqlCommand comm = new SqlCommand())
            {
                comm.Connection = conn;
                comm.CommandType = CommandType.Text;
                comm.CommandText = "insert into photo values (@pimage)";
                comm.Parameters.AddWithValue("@pimage",b);
                int n = comm.ExecuteNonQuery();
                if (n == 1)
                {
                    Label1.Text = "添加成功";
                }
                else
                {
                    Label1.Text = "添加失败";
                }
            }
            conn.Close();
        }
    }
    protected void Button1_Click(object sender, EventArgs e)
    {
        byte[] b = FileUpload1.FileBytes;
        insert(b);
      
        string connString = "server=.;database=pubs;uid=sa;pwd=";
        using (SqlConnection conn = new SqlConnection(connString))
        {
          
            conn.Open();
            using (SqlCommand comm = new SqlCommand())
            {
                comm.Connection = conn;
                comm.CommandType = CommandType.Text;
                comm.CommandText = "select pimage from photo where pid=2";

                byte[] fileData = (byte[])comm.ExecuteScalar();

                Response.BinaryWrite(fileData);
            }
            conn.Close();
        }
      

 


    }
}

<think>好的,我现在需要解决用户的问题:如何将数据库中的文件读取为字节数组并通过FTP上传。首先,我需要理清整个过程的大致步骤。用户提到了从数据库获取文件字节数组,然后上传到FTP服务器。根据之前用户提供的引用内容,引用[1]提到数据读取后需要处理并存储到数据库或输出到文件,这里的情况是反向操作,即从数据库读取后输出到FTP。引用[2]涉及PHP遍历数组查询数据库,可能相关。 首先,我需要确定用户使用的编程语言。问题中没有明确说明,但引用[2]提到了PHP,所以可能用户使用PHP。不过,也有可能用户使用其他语言如Java、Python等。考虑到用户示例中的代码是Python,但问题中的引用是PHP相关内容,可能需要进一步确认。但为了全面性,我可以分别给出不同语言的解决方案。 接下来,步骤分解: 1. 从数据库读取文件字节数组:需要连接到数据库,执行查询,获取结果。不同数据库(如MySQL、PostgreSQL)操作略有不同,但大体流程相似。例如,在PHP中使用PDO或mysqli扩展,在Python中使用MySQLdb或sqlite3模块。 2. 处理字节数组:确保数据以正确的格式读取,可能需要处理BLOB类型字段。 3. 连接到FTP服务器:使用FTP库,如PHP的ftp扩展,Python的ftplib。 4. 上传文件到FTP:将字节数组作为文件上传,可能需要使用临时文件或直接在内存中处理。 可能的难点:在PHP中,如何直接处理字节流上传到FTP,因为某些FTP函数可能需要文件路径而不是内存数据。这时候可能需要使用临时文件。Python的ftplib的storbinary方法可以直接处理字节流,不需要临时文件。 此外,错误处理也很重要,比如检查数据库连接、查询是否成功,FTP连接是否正常,上传是否完成等。 现在需要给出具体的代码示例。假设用户使用PHP,根据引用[2],用户可能熟悉PHP。但考虑到用户之前的示例代码是Python,也可能需要提供Python的示例。为了覆盖更多情况,我应该提供两种语言的示例。 在PHP中,从数据库读取BLOB数据,然后上传到FTP。假设使用MySQL数据库,BLOB字段存储文件内容。代码步骤: - 连接数据库,查询获取BLOB数据。 - 使用ftp_connect和ftp_login连接到FTP服务器。 - 将BLOB数据写入临时文件,然后使用ftp_put上传。 - 删除临时文件。 在Python中,使用sqlite3或MySQL连接库读取数据,然后用ftplib上传。Python的ftplib可以直接使用字节流,无需临时文件,这样更高效。 另外,需要注意字符编码、二进制模式传输等问题,确保文件在传输过程中不被损坏。 还要考虑安全性,如数据库连接信息、FTP凭证的处理,避免硬编码在代码中,建议使用环境变量或配置文件。 最后,生成相关问题,可能涉及其他文件操作、不同语言的实现方式、错误处理等。</think>### 从数据库读取文件字节数组并通过FTP上传的实现步骤 #### 一、技术实现逻辑 1. **数据库读取** - 连接数据库并执行查询,获取存储文件内容的BLOB类型字段 - 数据库操作需注意字符集和二进制流处理 2. **FTP文件上传** - 使用FTP协议将字节数组以文件形式传输到服务器 - 需处理主动/被动模式、传输类型(二进制/文本)等配置[^2] #### 二、PHP实现示例 ```php <?php // 1. 数据库连接与查询 $db = new PDO("mysql:host=localhost;dbname=test", "user", "password"); $stmt = $db->prepare("SELECT file_content FROM files WHERE id = ?"); $stmt->execute([$file_id]); $blobData = $stmt->fetchColumn(); // 2. 创建临时文件 $tempFile = tempnam(sys_get_temp_dir(), 'ftp_upload'); file_put_contents($tempFile, $blobData); // 3. FTP上传 $ftpConn = ftp_connect('ftp.example.com'); ftp_login($ftpConn, 'ftp_user', 'ftp_password'); ftp_pasv($ftpConn, true); // 启用被动模式 ftp_put($ftpConn, 'remote_filename', $tempFile, FTP_BINARY); // 4. 清理临时文件 unlink($tempFile); ?> ``` #### 三、Python实现示例 ```python import ftplib import mysql.connector # 1. 数据库读取 db = mysql.connector.connect( host="localhost", user="user", password="password", database="test" ) cursor = db.cursor() cursor.execute("SELECT file_content FROM files WHERE id = %s", (file_id,)) blob_data = cursor.fetchone()[0] # 2. 直接上传字节流 with ftplib.FTP('ftp.example.com', 'ftp_user', 'ftp_password') as ftp: ftp.set_pasv(True) # 被动模式 ftp.storbinary(f'STOR remote_filename', blob_data) ``` #### 四、关键注意事项 1. **二进制模式传输** FTP传输必须使用二进制模式(如`FTP_BINARY`/`'wb'`),否则文件会损坏 2. **内存优化** 大文件建议使用流式处理(PHP的`ftp_fput()`/Python的`storbinary`回调) 3. **错误处理** 需添加try-catch块处理数据库和网络异常
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值