Recentemente, houve um trabalho envolvendo e-mails, que exigia o upload de arquivos para um banco de dados e, em seguida, a leitura dos arquivos do banco de dados e o download deles.
Encontrei algumas informações e apliquei ao projeto.
A estrutura do banco de dados é a seguinte:
USAR[EOffice]
IR
/**//****** Objeto: Tabela [dbo].[Group_Files] Data do script: 20/07/2006 23:57:34 ******/
DEFINIR ANSI_NULLS ATIVADO
IR
DEFINIR QUOTED_IDENTIFIER ATIVADO
IR
DEFINIR ANSI_PADDING ATIVADO
IR
CRIAR TABELA [dbo].[Group_Files](
[ID] [int] IDENTIDADE(1,1) NÃO NULO,
[Nome do arquivo] [varchar](50) COLLATE Chinese_PRC_CI_AS NULL CONSTRAINT [DF_Group_Files_FileName] DEFAULT (''),
[FileBody] [imagem] NULO,
[FileType] [varchar](50) COLLATE Chinese_PRC_CI_AS NULL CONSTRAINT [DF_Group_Files_FileType] DEFAULT (''),
CONSTRAINT [PK_Group_Files] CHAVE PRIMÁRIA CLUSTERADA
(
[ID]ASC
)COM (IGNORE_DUP_KEY = DESLIGADO) LIGADO [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
DESATIVAR ANSI_PADDING
Então escrevi um procedimento armazenado com o seguinte código:
USAR[EOffice]
IR
/**//****** Objeto: StoredProcedure [dbo].[SendTo_Group_Email] Data do script: 20/07/2006 23:59:21 ******/
DEFINIR ANSI_NULLS ATIVADO
IR
DEFINIR QUOTED_IDENTIFIER ATIVADO
IR
Criar PROCEDIMENTO [dbo].[SendTo_Group_Email]
(
@Título varchar(200),
@Content varchar(MAX),
@Area varchar(máx),
@Remetente varchar(50),
@Depto varchar(50),
@SendToUser varchar(50),
@NomeArquivo varchar(200),
Imagem @FileBody,
@FileTypevarchar(4)
)
AS
INSERT Group_Email (Título,[Conteúdo],Área,SendToUser,Dept,Sender,FileName,FileBody,FileType) VALORES (@Title,@Content,@Area,@SendToUser,@Dept,@Sender,@FileName,@FileBody, @FileType)
O código do programa é o seguinte:
EnviarE-mail.aspx
1<%@ Page Language="C#" AutoEventWireup="true" CodeFile="SendEmail.aspx.cs" Inherits="GroupWork_SendEmail" %>
2
3<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" " http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd ">
4
5<html xmlns=" http://www.w3.org/1999/xhtml " >
6
7<head runat="servidor">
8 <title>Enviar e-mail</title>
9<meta http-equiv="Content-Type" content="text/html; charset=utf-8"><style type="text/css">
10corpo,td,th {
11 tamanho da fonte: 9pt;
12}
13corpo {
14 imagem de fundo: url();
15 cor de fundo: #F2F7FB;
16 margem esquerda: 10px;
17 margem superior: 5px;
18 margem direita: 10px;
19 margem inferior: 5px;
20}
21-->
22</style></head>
23<linguagem script="vbscript">
24função Select_Local_User(url)
25 dim k
26 k=showModalDialog(url,"","dialogWidth:485px;status:no;dialogHeight:280px")
27 se ubound(split(k," $#@&!"))>=0 então
28 document.form1.HiddenField1.value = split(k," $#@&!")(0 )
29 document.form1.txtLocalUser.value = split(k," $#@&!")(1 )
30 fim se
31função final
32
33função Select_Remote_User(url)
34 dim k
35 k=showModalDialog(url,"","dialogWidth:485px;status:no;dialogHeight:310px")
36 se ubound(split(k," $#@&!"))>=0 então
37 document.form1.HiddenField2.value = split(k," $#@&!")(0 )
38 document.form1.txtRemoteUser.value=split(k," $#@&!")(1 )
39 termina se
40função final
41
42</script>
43<corpo>
44 <form id="form1" method="post" enctype="multipart/form-data" runat="server">
45 <div style="text-align: center">
46 <table border="0" cellpadding="0" cellpacing="0" width="100%">
47
48 <td width="1%"><img src="../Images/spacer.gif" width="11" height="1" border="0" alt="" /></td>
49 <td colspan="2"><img src="../Images/spacer.gif" width="209" height="1" border="0" alt="" /></td>
50 <td width="1%"><img src="../Images/spacer.gif" width="12" height="1" border="0" alt="" /></td>
51 <td width="2%"><img src="../Images/spacer.gif" width="1" height="1" border="0" alt="" /></td>
52</tr>
53
54 <td style="height: 35px"><img src="../Images/ye_r1_c1.gif" alt="" name="ye_r1_c1" width="11" height="30" border="0" id ="ye_r1_c1" /></td>
55 cellpadding="0">
56
57 <td width="40" height="20"> </td>
58 <td width="79" valign="top"><strong>Registrar para recebimento</strong></td>
59</tr>
60 </table></td>
61 <td style="height: 35px"><img src="../Images/ye_r1_c3.gif" alt="" name="ye_r1_c3" width="12" height="30" border="0" id ="ye_r1_c3" /></td>
62 <td style="altura: 35px"></td>
63
64
65 <td background="../images/ye_r2_c1.gif"> </td>
66 <td width="13%"> </td>
67 <td width="83%" align="left"><img src="../Images/dj.gif" width="300" height="30" /></td>
68 <td background="../images/ye_r2_c3.gif"> </td>
69 <td></td>
70
71
72 <td background="../images/ye_r2_c1.gif"> </td>
73 <td colspan="2"><div align="center">
74 <table border="0" cellpadding="0" cellpacing="1" bgcolor="#CCCCCC" style="width: 566px">
75 <tr bgcolor="#b9d5f4">
76 <td style="largura: 186px; altura: 20px">
77 <div align="center" class="style2"> Título do arquivo</div></td>
78 <td colspan="2" alinhamento="esquerda" style="altura: 20px; largura: 433px;">
79 <asp:TextBox ID="txtTitle" runat="server" class="Input_TextBox" Width="277px"></asp:TextBox>
80 <asp:RequiredFieldValidator ID="RequiredFieldValidator2" runat="servidor" ControlToValidate="txtTitle"
81 Display="Dynamic" ErrorMessage="O título do arquivo não pode estar vazio."></asp:RequiredFieldValidator></td>
82
83 <tr bgcolor="#F1F5FC">
84 <td style="largura: 186px; altura: 20px">
85 usuários locais</td>
86 <td align="left" colspan="2" style="largura: 433px; altura: 20px">
87 <asp:TextBox ID="txtLocalUser" runat="server" Width="279px"></asp:TextBox><input
88 id="SelectLocal" class="Input_Button" name="SelectLocal" onClick="vbscript:Select_Local_User('..SelectMulti.aspx')" type="button"
89 value="select" /><asp:HiddenField ID="HiddenField1" runat="servidor" />
90
91
92 <tr bgcolor="#b9d5f4">
93 <td style="largura: 186px; altura: 20px">
94 usuários remotos</td>
95 <td align="left" colspan="2" style="largura: 433px; altura: 20px">
96 <asp:TextBox ID="txtRemoteUser" runat="server" Width="279px"></asp:TextBox>
97 <input id="SelectRemote" class="Input_Button" name="SelectRemote" onClick="vbscript:Select_Remote_User('..SelectRemoteUser.aspx')"
98 type="botão" valor="selecionar" />
99 <asp:HiddenField ID="HiddenField2" runat="servidor" />
100
101
102 <tr bgcolor="#F1F5FC">
103 <td rowspan="2" align="center" style="width: 186px; height: 11px;"> Upload de arquivo</td>
104 <td colspan="2" rowspan="2" align="left" valign="top" bgcolor="#F1F5FC" style="largura: 433px; altura: 11px;">
105 <input id="Arquivo1" runat="servidor" style="largura: 381px" type="arquivo" /><br />
106 <input id="Arquivo2" runat="servidor" style="largura: 379px" type="arquivo" />
107 <input id="Arquivo3" runat="servidor" style="largura: 379px" type="arquivo" />
108 <input id="Arquivo4" runat="servidor" style="largura: 379px" type="arquivo" />
109 <input id="Arquivo5" runat="servidor" style="largura: 377px" type="arquivo" /></td>
110
111
112
113 <tr bgcolor="#B9D5F4">
114 <td style="largura: 186px; altura: 22px;">
115 <div align="center" class="style2"> Conteúdo do e-mail</div></td>
116 <td colspan="2" align="left" style="largura: 433px; altura: 22px;">
117 <asp:TextBox ID="txtContent" runat="server" Height="57px" TextMode="MultiLine" Width="296px" class="Input_TextBox"></asp:TextBox>
118 <asp:RequiredFieldValidator ID="RequiredFieldValidator7" runat="servidor" ControlToValidate="txtContent"
119 Display="Dynamic" ErrorMessage="O conteúdo do e-mail não pode estar vazio."></asp:RequiredFieldValidator></td>
120
121 <tr bgcolor="#F1F5FC">
122 <td style="largura: 186px; altura: 6px">
123
124 <td colspan="2" alinhar="esquerda" style="altura: 6px; largura: 433px;">
125 <asp:CheckBox ID="chkSms" runat="servidor" Text="Notificação por SMS" />
126 <asp:Button ID="btnSubmit" runat="server" OnClick="btnSubmit_Click" Text="Submit" class="Input_Button" />
127 <input type="reset" name="Submit" value="Reset" class="Input_Button" /></td>
128
129 </tabela>
130 </div></td>
131 <td background="../images/ye_r2_c3.gif"> </td>
132 <td></td>
133
134
135 <td><img src="../Images/ye_r3_c1.gif" alt="" name="ye_r3_c1" width="11" height="22" border="0" id="ye_r3_c1" />< /td>
136 <td colspan="2" background="../images/ye_r3_c2.gif"> </td>
137 /td>
138 <td></td>
139
140 </tabela>
141
142
143</corpo>
144</html>
145
EnviarE-mail.aspx.cs
1usando Sistema;
2usando System.Data;
3usando System.Configuration;
4usando System.Collections;
5usando System.Web;
6usando System.Web.Security;
7usando System.Web.UI;
8usando System.Web.UI.WebControls;
9usando System.Web.UI.WebControls.WebParts;
10usando System.Web.UI.HtmlControls;
11
12usando System.Data;
13usando System.Data.SqlClient;
14usando EOffice.Model;
15usando EOffice.SqlServer;
16usando System.IO;
17usando System.Configuration;
18
19 //usando iWebSMS2000;
20[Serializável]
21classe parcial pública GroupWork_SendEmail: System.Web.UI.Page
vinte e dois{
23 conexão pública SqlConnection;
24 //SMS iSMS2000 público;
25 //public DBstep.SMSClient2000 ObjiSMSClient2000;
26 Page_Load nulo protegido (remetente do objeto, EventArgs e)
27 {
28 conexão = new SqlConnection("SERVER=SERVER;UID=sa;PWD=8860;database=EOFFICE_SERVER;");
29
30}
31 void protegido btnSubmit_Click(objeto remetente, EventArgs e)
32 {
33 String strTítulo = txtTítulo.Texto;
34 String strContent = txtContent.Text;
35 UserInfo info = (UserInfo)Session["EOfficeUserInfo"];
36 String strNomeUsuário = info.NomeUsuário;
37 String strTmpDept = info.DeptId.ToString();
38
39 String strNomeUnit = ConfigurationSettings.AppSettings["NomeUnit"];
40 String strServerFileIndex = ""; //Índice de anexo de arquivo do lado do servidor
41 String strClientFileIndex = ""; //Índice de anexo do arquivo cliente
42
43 String strRemote = HiddenField2.Value;
44 String[] strRemoteUser = strRemote.Split(',');
45 String strTmpUserName;
46 String strTmpServer;
47 Booleano bDone = falso;
48
49 /**/////////Fazer upload de vários códigos de anexo//////////////
50 //Obter o elemento do formulário Arquivo
51 arquivos HttpFileCollection = HttpContext.Current.Request.Files;
52 HttpPostedFile postadoArquivo;
53
54 foreach (string strUser em strRemoteUser)
55 {
56 String[] strSplit = strUser.Split('/');
57 strTmpUserName = strSplit[0];
58 strTmpServer = strSplit[1];
59 String strConnectString = "";
60 String strAreaName = "";
61 int nAreaID = 0;
62 StringstrDept = "";
63strClientFileIndex = "";
64 SqlConnection connClient;
65
66 String strSQL = "Selecionar * Da área Onde AreaCode='" + strTmpServer + "'";
67 SqlCommand cmd = novo SqlCommand(strSQL, conn);
68 cmd.Connection.Open();
69 usando (SqlDataReader sdr = cmd.ExecuteReader())
70 {
71 se (sdr.Leitura())
72 {
73 strConnectString = sdr["ConnectString"].ToString();
74 strAreaName = sdr["AreaName"].ToString();
75 nAreaID = Convert.ToInt16(sdr["ID"]);
76}
77}
78 cmd.Connection.Close();
79
80 strSQL = "Selecione * From MemberList Where UserName='" + strTmpUserName + "' And AreaID=" + nAreaID;
81 cmd = novo SqlCommand(strSQL, conn);
82 cmd.Connection.Open();
83 usando (SqlDataReader sdr = cmd.ExecuteReader())
84 {
85 se (sdr.Leitura())
86 {
87 strDept = sdr["Dept"].ToString();
88}
89}
90 cmd.Connection.Close();
91
92 connClient = new SqlConnection(strConnectString);
93
94 para (int intCount = 0; intCount < arquivos.Count; intCount++)
95 {
96 arquivo postado = arquivos[intCount];
97
98 se (postedFile.ContentLength > 0)
99 {
100 String strOldFilePath = postFile.FileName;
101 String strNomeArquivo = strOldFilePath.Substring(strOldFilePath.LastIndexOf("\") + 1);
102
103 //Enviar arquivos para o servidor
104 //File1.PostedFile.SaveAs("c:\Test\" + DateTime.Now.ToString("yyyyMMddhhmmss") + strExtension);
105
106 //Usado para salvar o tamanho do arquivo
107 int intDocLen;
108 //Stream é usado para ler os dados enviados
109 Fluxo objStream;
110 String strDocExt;
111 //Carrega o conteúdo específico do arquivo
112 intDocLen = postFile.ContentLength;
113 strDocExt = strOldFilePath.Substring(strOldFilePath.LastIndexOf(".") + 1);
114
115 byte[] Docbuffer = novo byte[intDocLen];
116 objStream = postFile.InputStream;
117
118
119 //Salva o arquivo no cache
120
121 //O cache será salvo no banco de dados
122 objStream.Read(Docbuffer, 0, intDocLen);
123
124 string fileType = postFile.ContentType;
125
126
127 //Executa o procedimento armazenado do lado do servidor Send_Group_Email
128 se (!bConcluído)
129 {
130 cmd = new SqlCommand("Send_Group_Email", conexão);
131 cmd.CommandType = CommandType.StoredProcedure;
132 cmd.Parameters.Add("@NomeArquivo ", SqlDbType.VarChar, 200);
133 cmd.Parameters.Add("@FileBody", SqlDbType.Image);
134 cmd.Parameters.Add("@FileType", SqlDbType.VarChar, 4);
135 cmd.Parameters.Add("@File_Index", SqlDbType.Int);
136
137 cmd.Parâmetros[0].Valor = strNomeArquivo;
138 cmd.Parâmetros[1].Valor = Docbuffer;
139 //cmd.Parâmetros[2].Value = strDocExt;]
140 cmd.Parâmetros[2].Valor = tipo de arquivo;
141
142 //cmd.Parameters.Add(new SqlParameter("@File_Index", SqlDbType.Int));
143 cmd.Parameters[3].Direction = ParameterDirection.ReturnValue;
144 cmd.Connection.Open();
145 cmd.ExecuteNonQuery();
146 strServerFileIndex += cmd.Parameters[3].Value.ToString() + ",";
147 cmd.Connection.Close();
148}
149
150 //Executa o procedimento armazenado do cliente Get_Upload_File
151 cmd = new SqlCommand("Get_Upload_File", connClient);
152 cmd.CommandType = CommandType.StoredProcedure;
153 cmd.Parameters.Add("@NomeArquivo ", SqlDbType.VarChar, 200);
154 cmd.Parameters.Add("@FileBody", SqlDbType.Image);
155 cmd.Parameters.Add("@FileType", SqlDbType.VarChar, 4);
156 cmd.Parameters.Add("@File_Index", SqlDbType.Int);
157
158 cmd.Parâmetros[0].Valor = strNomeArquivo;
159 cmd.Parâmetros[1].Valor = Docbuffer;
160 //cmd.Parâmetros[2].Valor = strDocExt;
161 cmd.Parâmetros[2].Valor = tipo de arquivo;
162
163 //cmd.Parameters.Add(new SqlParameter("@File_Index", SqlDbType.Int));
164 cmd.Parameters[3].Direction = ParameterDirection.ReturnValue;
165 cmd.Connection.Open();
166 cmd.ExecuteNonQuery();
167 strClientFileIndex += cmd.Parameters[3].Value.ToString() + ",";
168 cmd.Connection.Close();
169}
170
171 if (intCount.Equals(arquivos.Count - 1))
172 {
173 bConcluído = verdadeiro;
174}
175}
176
177 strClientFileIndex = strClientFileIndex.Remove(strClientFileIndex.Length - 1);
178
179 strSQL = "Inserir em Group_Email (Título,Conteúdo,Área,SendToUser,Dept,Sender,Files_Index)";
180 strSQL += "valores(";
181 strSQL += "'" + strTitle + "',";
182 strSQL += "'" + strContent + "',";
183 strSQL += "'" + strNomeUnit + "',";
184 strSQL += "'" + strTmpUserName + "',";
185 strSQL += "'" + strDept + "',";
186 strSQL += "'" + strNomeUsuário + "',";
187 strSQL += "'" + strClientFileIndex + "')";
188 cmd = novo SqlCommand(strSQL, connClient);
189 cmd.Connection.Open();
190 cmd.ExecuteNonQuery();
191 cmd.Connection.Close();
192
193 String strTmpServerFileIndex = strServerFileIndex.Remove(strServerFileIndex.Length - 1);
194
195 strSQL = "Inserir em Group_Email_Sever (Título,Conteúdo,Área,SendToUser,Dept,Sender,Files_Index)";
196 strSQL += "valores(";
197 strSQL += "'" + strTitle + "',";
198 strSQL += "'" + strContent + "',";
199 strSQL += "'" + strAreaName + "',";
200 strSQL += "'" + strTmpUserName + "',";
201 strSQL += "'" + strTmpDept + "',";
202 strSQL += "'" + strNomeUsuário + "',";
203 strSQL += "'" + strTmpServerFileIndex + "')";
204 cmd = novo SqlCommand(strSQL, conn);
205 cmd.Connection.Open();
206 cmd.ExecuteNonQuery();
207 cmd.Connection.Close();
208}
209 /**/////////Terminar upload de vários anexos//////////////
210 Response.Redirect("../SuccessMsg.aspx");
211}
212}
213
Código para baixar o arquivo:
DownFile.aspx
DownFile.aspx.cs
1usando Sistema;
2usando System.Data;
3usando System.Configuration;
4usando System.Collections;
5usando System.Web;
6usando System.Web.Security;
7usando System.Web.UI;
8usando System.Web.UI.WebControls;
9usando System.Web.UI.WebControls.WebParts;
10usando System.Web.UI.HtmlControls;
11
12usando System.Data;
13usando System.Data.SqlClient;
14usando EOffice.Model;
15usando EOffice.SqlServer;
16usando System.IO;
17
18[Serializável]
19classe parcial pública GroupWork_DownFile: System.Web.UI.Page
20{
21 conexão pública SqlConnection;
22 String pública strFileID;
23 informações públicas do UserInfo;
24 Page_Load nulo protegido (remetente do objeto, EventArgs e)
25 {
26 strFileID = Request.QueryString["ID"];
27 info = (UserInfo)Sessão["EOfficeUserInfo"];
28
29 se (strFileID == nulo)
30 {
31 Response.Redirect("../ErrorMsg.aspx");
32}
33
34 DbLink db = new DbLink();
35 conexão = db.Connect();
36
37 String strSQL = "Selecione * From Group_Files Where ID=" + strFileID //+ " And SendToUser = '" + info.UserName + "'";
38 SqlCommand cmd = novo SqlCommand(strSQL, conn);
39 cmd.Connection.Open();
40 usando (SqlDataReader sdr = cmd.ExecuteReader())
41 {
42 se (!sdr.Read())
43 {
44 Response.Redirect("../ErrorMsg.aspx");
45}
46 mais
47 {
48 Response.Clear();
49 String strNomeArquivo = sdr["NomeArquivo"].ToString();
50 Response.ContentType = "APLICATIVO/OCTET-STREAM";
51 Response.AddHeader("disposição de conteúdo", "anexo;nome do arquivo=" + HttpUtility.UrlEncode(strFileName));
52 Response.Buffer = verdadeiro;
53 Response.BinaryWrite((byte[])sdr["FileBody"]);
54
55 //Resposta.Clear();
56 //Response.ContentType = "aplicativo/fluxo de octetos";
57 /**/////Response.AddHeader("Content-Type", sdr["FileType"].ToString());
58 //Response.BinaryWrite((byte[])sdr["FileBody"]);
59}
60}
61 //conn.Close();
62
63 /**//*
64 SqlDataAdapter da = new SqlDataAdapter(strSQL, conn);
65 SqlCommandBuilder MyCB = novo SqlCommandBuilder(da);
66 DataSet ds = new DataSet("MinhasImagens");
67 byte[] MeusDados = novo byte[0];
68 da.Fill(ds, "MinhasImagens");
69 DataRow minhaRow = ds.Tables["MinhasImagens"].Rows[0];
70 String strNomeArquivo = Convert.ToString(minhaRow["NomeArquivo"]);
71 MeusDados = (byte[])minhaLinha["FileBody"];
72 int ArraySize = new int();
73 ArraySize = MyData.GetUpperBound(0);
74 FileStream fs = new FileStream(@"C:\Download" + strFileName,
75 FileMode.OpenOrCreate, FileAccess.Write);
76 fs.Write(MeusDados, 0, ArraySize);
77 fs.Close();
78 */
79 //Response.Write("Baixar arquivo" + strFileName + "Sucesso!");
80}
81}
82