如何在ASP.NET中制作文件上传接口

2023-12-07

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

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

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

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

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

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


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

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

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

Saving:

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>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在ASP.NET中制作文件上传接口 的相关文章

随机推荐

  • 当使用 WinSCP 选择要上传到 FTP 服务器的文件的掩码与文件不匹配时,SSIS 任务失败

    我正在创建一个 SSIS 包 它使用脚本任务 通过 WinSCP 将文件上传到 FTP 上传工作正常 但是如果没有上传文件 我需要该过程失败 目前它只是循环并成功通过 在 WinSCP 命令文件中编写脚本方面还没有获得任何帮助 option
  • 如何在selenium中查找具有多个类的元素

    我有一个包含 3 个类的元素 我需要用 selenium 找到它
  • 文本转语音(TTS)-Android

    我是android平台的新手 现在我正在努力TTS Text to Speech 如果我在文本区域中输入文本 并且希望在单击 发言 按钮时将其转换为语音 谁能帮我吗 文本转语音功能内置于 Android 1 6 中 这是一个如何执行此操作的
  • 如何获取 TextView 的精确位置(以像素为单位)?

    我有一部 2560 x 1440 像素的智能手机 现在我正在使用这个功能TextView int locationOnScreen new int 2 txtAp GetLocationInWindow locationOnScreen 它
  • 为具有圆角的 UIImageView 创建阴影?

    我正在尝试创建一个ImageView它有圆角和阴影以赋予它一些深度 我能够为UIImageView 但是每当我添加代码以使其具有圆角时 它只有圆角而没有阴影 我有一个IBOutlet named myImage 并且它位于viewDidLo
  • pandas 中的单列

    有没有办法在不影响数据框其余部分的情况下对 pandas 中的单个列进行舍入 gt gt gt print df item value1 value2 0 a 1 12 1 3 1 a 1 50 2 5 2 a 0 10 0 0 3 b 3
  • 在哪里以及如何定义应用程序属性? - JHIpster

    在 Spring Boot 中 可以在 application properties 文件中定义应用程序属性 例如 Rest 的前缀可以定义为 spring data rest basePath api 对于基于 Spring Boot 的
  • 游标如何引用已删除的行?

    当我从 Android 中的 sqlite 数据库查询返回游标时 它似乎包含固定数量的行 无论数据库发生什么情况 这些行都不会改变 例如 如果在光标打开时删除了某些行 我仍然可以引用已删除的行 这很好 但是它是如何工作的呢 一种猜测可能是
  • 哪些 Boost 功能与 C++11 重叠?

    几年前 我把我的 C 技能束之高阁 现在看来 当我再次需要它们时 情况已经发生了变化 我们现在有了 C 11 我的理解是它重叠了许多 Boost 功能 是否有一些总结 这些重叠在哪里 哪些 Boost 库将成为遗产 建议使用哪些 C 11
  • 将 xml 列中的数据插入到临时表中

    我有一个 xml 列 看起来像 SET XMLData
  • ggplot 在 X 轴下方添加跟踪颜色

    我想在 x 轴下方添加一条线 其颜色取决于未绘制的因素 在此示例中 我正在创建一个箱形图 并希望添加一条指示另一个变量的线 以汽车数据集为例 然后实际思考我正在尝试做的事情 ggplot mtcars aes factor cyl mpg
  • 为什么 angular2 多次执行方法?

    我的应用程序结构如下所示 ts export class TodoListComponent get sortedTodos ITodo console log this counter html div class todo item d
  • 在 C# 中将日期时间转换为儒略日期(ToOADate 安全吗?)

    我需要从标准转换公历约会到Julian天数 我在 C 中没有看到任何直接执行此操作的文档 但我发现许多帖子 在谷歌搜索时 建议使用ToOADate 有关的文档ToOADate不建议将此作为儒略日期的有效转换方法 任何人都可以澄清此函数是否能
  • HTML Favicon.ico 不会在 Google Chrome 上显示

    我正在制作一个 HTML 页面 我想要的东西之一是标题旁边出现一个图标 我使用的是 Google Chrome 我看到其他网站上的图标可以正常工作 但我网站上的图标不会显示 该网站位于我桌面上名为 site 的文件夹中 The favico
  • 类型“string[]”上不存在属性“includes”

    收到错误 类型 string 上不存在属性 includes 在node modules ng2 breadcrumb app components breadcrumbService ts中 我正在尝试在 angular2 应用程序中实现
  • C++ 计数和映射

    我正在计算每个单词在文本文件中出现的次数 我想避免出现这种情况 因此我会减少我的输入 然后进行计数 我有一个地图数据结构 其中有 string 和 int 来保持计数 现在 当我输出单词及其计数时 我不希望单词为小写 而是希望它保持其原始大
  • R:绘图:重新排列变量的顺序

    我想在 R 中创建一个条形图 但是 我想重新排列 x 轴上的变量 不是按频率 而是按 含义 假设我有以下数据集 df lt data frame read table header TRUE text ID Radio 1 A 2 B 3
  • 为什么 Subversion 不允许提交 .htaccess 文件?

    我无法从 Windows SVN 客户端 TortoiseSVN 提交 htaccess 文件 返回的错误是 无法读取状态行 现有连接被远程主机强制关闭 这基本上是我的虚拟主机在 Apache 中的样子
  • 仅当字符串数组中的元素长度大于零时,如何才能显示此应用程序中的元素?

    我正在使用 Vue 3 TypeScript 和电影数据库 TMDB 开发 SPA 该应用程序显示列表电影卡 In the 电影列表成分 src components MoviesList vue 我有
  • 如何在ASP.NET中制作文件上传接口

    我正在尝试在 ASP NET Webforms 中创建一个文件上传界面 并正在寻找一些有关如何继续的建议 文件上传界面是我正在制作的网站的一部分 用户可以在该网站上发布广告 该界面是 创建新广告 的一部分 允许用户上传最多 6 张图像 我只