gpt4 book ai didi

asp.net - 如何在ASP.NET中制作文件上传接口(interface)

转载 作者:行者123 更新时间:2023-12-02 10:41:40 27 4
gpt4 key购买 nike

我正在尝试在 ASP.NET Webforms 中创建文件上传界面,并正在寻找一些有关如何继续的建议。

文件上传界面是我正在制作的网站的一部分,用户可以在该网站上发布广告。该界面是“创建新广告”的一部分,允许用户上传最多 6 张图像。我只使用 asp.net FileUpload 服务器控件,因为我试图制作一个在用户禁用 javascript 时可以工作的控件。这就是背景。

单击按钮即可上传所有 6 个文件。这会将文件存储在临时文件夹 (/UserUploads/temp) 中,直到用户提交表单(在这种情况下,文件将移动到/UserUploads 文件夹和数据库中的引用),或者直到用户点击取消按钮或导航离开在这种情况下文件将被删除。

第一个问题是:将文件存储在临时目录中是否是解决此问题的正确方法?或者是否有更好的方法将临时文件保留在服务器上,直到提交父表单?我能想到的唯一选择是将文件保存到 session 中,但这似乎是杀死服务器的秘诀......

第二个问题:我不清楚当用户关闭浏览器窗口时该怎么办。我想避免在临时目录中出现一堆困惑的孤立文件。如果用户不完成表单提交,是否有某种方法可以确保所有文件都被清除?或者我只需要经常清理临时目录?

第三个问题:我这样做是否完全错误,实际上有更好的方法来上传多个文件?

最佳答案

1) 如果您使用 SQL Server,我个人更喜欢将上传的文件存储在 varbinary(max) 字段中,并通过其唯一 ID 来使用它们。然后您不必担心名称冲突或数据库与文件系统不同步。这还允许您的上传过程独立于父表单的插入。

下面的示例展示了如何从 FormView 中的 FileUpload 控件获取文件流(和元数据),并将其作为参数提供给 SQL 存储过程。然后,使用实现 IHTTPHandler 的类从数据库检索文件。

2)就清除临时文件而言,我会将每个上传的文件与临时主记录相关联,以便将它们捆绑在一起。当确认真正的母版后,删除临时母版(以及来自真实母版的引用文件)。然后定期运行 SQL 代理作业以删除早于 X 时间的临时主文件和关联文件。

保存:

Protected Sub DetailsView1_ItemInserting(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.DetailsViewInsertEventArgs) Handles DetailsView1.ItemInserting
Dim objUploader As FileUpload = DetailsView1.FindControl("fuFile")
If objUploader.HasFile Then
Dim strFileName As String = objUploader.PostedFile.FileName
strFileName = strFileName.Substring(strFileName.LastIndexOf("\") + 1)
Dim objFileStream As System.IO.Stream = objUploader.PostedFile.InputStream
Dim arrFileImageByteArray(objFileStream.Length) As Byte
objFileStream.Read(arrFileImageByteArray, 0, objFileStream.Length)
e.Values.Insert(0, "FileImage", arrFileImageByteArray)
e.Values.Insert(1, "FileName", strFileName)
e.Values.Insert(3, "PostingDate", Now)
e.Values.Insert(5, "Application", "CorpForms")
Else
e.Cancel = True
objMessages.Add(New StatusMessage(MessageType.Warning, "File Upload canceled. No file was selected."))
End If
End Sub

检索:

Public Class FileServiceHandler : Implements IHttpHandler

Public Sub ProcessRequest(ByVal context As HttpContext) Implements IHttpHandler.ProcessRequest

Dim idFileID As Guid
If context.Request.QueryString("FileID") IsNot Nothing Then
Dim strFileID As String = context.Request.QueryString("FileID")
Try
idFileID = Guid.Parse(strFileID)
Catch ex As Exception
Throw New Exception("Unable to parse File ID")
End Try
End If

Dim objConnection As New SqlConnection(ConfigurationManager.ConnectionStrings("PublicWebConnectionString").ConnectionString)
Dim objCommand As SqlCommand = objConnection.CreateCommand
Dim objReader As SqlDataReader

objCommand.CommandType = Data.CommandType.StoredProcedure
objCommand.CommandText = "spGetUploadedFile"
objCommand.Parameters.AddWithValue("FileID", idFileID.ToString)

Dim arrFileImage() As Byte = Nothing
Dim strFileName As String = String.Empty
Try
objConnection.Open()
objReader = objCommand.ExecuteReader
While objReader.Read
If Not IsDBNull(objReader("FileImage")) Then
arrFileImage = objReader("FileImage")
End If
If Not IsDBNull(objReader("FileName")) Then
strFileName = objReader("FileName")
End If
End While
Catch ex As Exception
Throw New Exception("There was a problem retreiving the file: " & ex.Message)
End Try
If objConnection.State <> Data.ConnectionState.Closed Then
objConnection.Close()
End If
If arrFileImage IsNot Nothing Then
context.Response.Clear()
context.Response.AddHeader("content-disposition", "attachment;filename=" & strFileName)
context.Response.BinaryWrite(arrFileImage)
context.Response.End()
Else
context.Response.ContentType = "text/plain"
context.Response.Write("Unable to retrieve file ID# " & idFileID.ToString)
End If
End Sub

Public ReadOnly Property IsReusable() As Boolean Implements IHttpHandler.IsReusable
Get
Return True
End Get
End Property

End Class

文件检索路径中的Web.Config:

<configuration>
<system.web>
<httpHandlers>
<add verb="GET" path="*" type="MyNamespace.FileServiceHandler" />
</httpHandlers>
</system.web>
<system.webServer>
<handlers>
<add name="MyNamespace.FileServiceHandler" path="*" verb="*" type="MyNamespace.FileServiceHandler" resourceType="Unspecified" preCondition="integratedMode" />
</handlers>
</system.webServer>
</configuration>

关于asp.net - 如何在ASP.NET中制作文件上传接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6777491/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com