C# PHP:上传的文件似乎只知道如何在每次重启应用程序时处理1个文件?

C# PHP:上传的文件似乎只知道如何在每次重启应用程序时处理1个文件?,c#,php,C#,Php,在C#中,我有代码将文件异步上传到php文件,然后在php文件中分配唯一ID(由C#代码给出),然后将文件存储在数据库中。这可以运行多次,但似乎只适用于上传的第一个文件,而不适用于后续文件 也许(是上传的文件($\u FILES['file']['tmp\u name'])只知道如何引用它接收到的第一个文件,而不知道如何从内存中清除它?因此不久之后它接收到的其他文件被称为(是上传的文件($FILES['file2']['tmp\u name']或其他什么。只是一个暗中的镜头 我不打算发布一堆代码

在C#中,我有代码将文件异步上传到php文件,然后在php文件中分配唯一ID(由C#代码给出),然后将文件存储在数据库中。这可以运行多次,但似乎只适用于上传的第一个文件,而不适用于后续文件

也许(
是上传的文件($\u FILES['file']['tmp\u name']
)只知道如何引用它接收到的第一个文件,而不知道如何从内存中清除它?因此不久之后它接收到的其他文件被称为(
是上传的文件($FILES['file2']['tmp\u name']
或其他什么。只是一个暗中的镜头

我不打算发布一堆代码,因为我的代码非常简单,据我所知,这并不是一个问题,就我所知,这是这个错误可能发生的唯一原因

编辑:很好,它不是那么简单,但下面是代码:

C#

PHP



您必须在代码中做两个小更改:

  • 表单输入字段中的名称必须是一个数组,以获取多个文件,并且必须注意/宣布可以上载多个文件:

    <input type="file" name="attachements[]" multiple="multiple" id="attachements" />
    
    如果您在其他网站上处理上载,只需在操作中输入文件名,如下所示:

    <form action="url/to/file/handle-upload.php" enctype="multipart/form-data" method="post">
    
    
    
在这里,您可以找到一种使用ajax实现它的方法:

解决方案是围绕整个方法构建一些小功能


在这里,您可以在html5标准中找到。

当您通过
C#
直接发送没有任何html或表单的文件时,我现在验证了您的
C#
代码,并指出了一个错误

你必须看到我所做的主要陈述,关于
C#
中的符号,我可能是错的,因为我没有使用它。因此,你有可能需要调整我的代码

重要的一点是:在每个循环中只发送一个文件

这是您的代码,通常调整为上载多个文件(如果可用):

foreach (MailItem email in Globals.ThisAddIn.Application.ActiveExplorer().Selection)
{
    string email_id = ArchiveEmail(email);

    if (chkBoxSyncEmail.Checked)
    {    
        // collecting attachements
        array attachements;                                    
        foreach (Attachment atch in email.Attachments)
        {            
            if(AttachmentsBeingSent.Contains(atch.FileName))
            {
                string filePath = Path.Combine(@"", (email_id + atch.FileName)); //We add the unique email_id to the beginning of the filename, it is always 13 chars long so we can pull the unique id off later with ease.
                atch.SaveAsFile(filePath); //Save as file
                attachements[] = filePath;
            }
        }
        try
        {
            // if there are any attachements, do upload
            if(sizeof(attachements))
            {
                //Sending attachments.
                WebClient wc = new WebClient();
                await wc.UploadFileTaskAsync(new Uri("https://xxxx.com/xxxx/xxxx/xxxx/upload_attachment.php"), "POST", attachements);                             

                ...
            }                        
        }                      
    }
}

我删除了几行带有某种逻辑的代码,这些代码只准备发送一个文件。如果您同时发送多个文件,情况会有所不同,您无法处理每个文件的反馈,至少不能像您编码的那样处理反馈。

如果您的代码“非常简单”,那么就没有任何理由发布“一堆代码”。您应该只包含相关的内容,但确实需要包含这些内容。如果您要发布多个文件,则
$FILES['File']['tmp\u name'][0]
然后
$FILES['File']['tmp\u name'][1]
换句话说,您必须以循环方式处理上传的文件。请查看我的编辑,因此您的意思是,如果我上传4个文件,它必须是$files['file4'][tmp_name'][0]并且是一个数组?我正在调用upload方法一次,等待它完成,然后再执行一次,我是否可以删除这些文件,使其返回到$u文件['file']?从技术上讲,我不认为我一次发送多个文件,现在包含了代码。我可以快速地看一眼,而不是一次上载多个文件,我可以在使用完数组后清除它吗?谢谢,但我根本不使用HTML。我目前的工作原理是,它“不处理多个文件”的原因实际上是因为在表中,我将email_ID设置为主键,我认为这会覆盖其他具有相同email_ID的主键,而且显然每个唯一记录只能有一个PK,所以我现在正在测试这一理论。感谢您的帮助。@PhinFuhr在任何情况下,您都必须将文件附加到数组变量,如
attachements[]
而且不仅仅是
附件
。有趣的是,我今天才第一次在设置过滤器的URL中用
?search[]=php&search[]对其进行了评论=mysql
,如果它仅像这样使用:
?search=php&search=mysql
一个值将覆盖另一个值。老实说,我不知道你的意思,David.:(这不是关于文件上传,而是关于发送内容时变量的使用。看看这个url:
https://codecourse.com/library/all?free=false&page=1&subjects[]=mysql&subjects[]=php&type=
您也可以访问该站点并更改选择。在我的第二个答案之后,我想您理解;-)我会记住这一点,它目前正在按预期工作,我唯一关心的是,如果C#代码上的两个不同客户端尝试将一个文件上载到同一个php脚本,那么它将忽略一个客户端,而只为一个客户端提供服务。代码编辑得很好!谢谢!使用新代码,文件只为每个邮件收集,因此不同邮件的文件仍然是可用的分开。希望投票作为答案(绿色支票)。;-)并且顺便说一句。PHP并没有像你担心的那样合并多个请求。每个请求也是分开处理的。
<input type="file" name="attachements[]" multiple="multiple" id="attachements" />
<form action="" enctype="multipart/form-data" method="post">
<form action="url/to/file/handle-upload.php" enctype="multipart/form-data" method="post">
foreach (MailItem email in Globals.ThisAddIn.Application.ActiveExplorer().Selection)
{
    string email_id = ArchiveEmail(email);

    if (chkBoxSyncEmail.Checked)
    {    
        // collecting attachements
        array attachements;                                    
        foreach (Attachment atch in email.Attachments)
        {            
            if(AttachmentsBeingSent.Contains(atch.FileName))
            {
                string filePath = Path.Combine(@"", (email_id + atch.FileName)); //We add the unique email_id to the beginning of the filename, it is always 13 chars long so we can pull the unique id off later with ease.
                atch.SaveAsFile(filePath); //Save as file
                attachements[] = filePath;
            }
        }
        try
        {
            // if there are any attachements, do upload
            if(sizeof(attachements))
            {
                //Sending attachments.
                WebClient wc = new WebClient();
                await wc.UploadFileTaskAsync(new Uri("https://xxxx.com/xxxx/xxxx/xxxx/upload_attachment.php"), "POST", attachements);                             

                ...
            }                        
        }                      
    }
}