2017-03-08 50 views
-1

我可以用multipart/form-data上传一个文件,但是我找不到任何有关multipart/form-data上传文件夹的教程。 这是我的代码上传文件:我可以使用multipart/form-data上传文件夹吗?

HTML:

<form name="form1" method="post" enctype="multipart/form-data" action="api/upload"> 
      <fieldset> 
       <legend>File Upload Example</legend> 
      <div> 
       <label for="caption">Image Caption</label> 
       <input name="caption" type="text" /> 
      </div> 
      <div> 
       <label for="image1">Image File</label> 
       <input name="image1" type="file" /> 
      </div> 
      <div> 
       <input type="submit" value="Submit" /> 
      </div> 
       </fieldset> 
     </form> 

控制器:

public class UploadController : ApiController 
{ 
    [AcceptVerbs("GET", "POST")] 
    public async Task<HttpResponseMessage> PostFile() 
    { 
     // Check if the request contains multipart/form-data. 
     if (!Request.Content.IsMimeMultipartContent()) 
     { 
      throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType); 
     } 

     string root = HttpContext.Current.Server.MapPath("~/App_Data"); 
     var provider = new MultipartFormDataStreamProvider(root); 

     try 
     { 
      StringBuilder sb = new StringBuilder(); // Holds the response body 

      // Read the form data and return an async task. 
      await Request.Content.ReadAsMultipartAsync(provider); 


      // This illustrates how to get the file names for uploaded files. 
      foreach (var file in provider.FileData) 
      { 
       var originalFile = file.Headers.ContentDisposition.FileName.TrimStart('"').TrimEnd('"'); ; 
       FileInfo fileInfo = new FileInfo(file.LocalFileName); 
       fileInfo.CopyTo(Path.Combine(root, originalFile), true); 

       sb.Append(string.Format("Uploaded file: {0} ({1} bytes)\n", originalFile, fileInfo.Length)); 
       fileInfo.Delete(); 
      } 

      return new HttpResponseMessage() 
      { 
       Content = new StringContent(sb.ToString()) 
      }; 
     } 
     catch (System.Exception e) 
     { 
      return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, e); 
     } 
    } 

} 

我可以使用multipart/form-data上传文件夹?

+0

文件上传基于RFC 1867(https://www.ietf.org/rfc/rfc1867.txt),没有提到'文件夹'这是一个模糊的概念。所以你可以上传一个文件列表,就是这样 –

+0

在用javascript上传每个文件之前,如何获取文件夹中的列表文件? –

+2

这里有很好的解释:https://developer.mozilla.org/en/docs/Using_files_from_web_applications或者你使用'',或者你使用一个带有'event.datatransfer.files'的拖放区域https://developer.mozilla.org/en/docs/Web/API/DataTransfer/files –

回答

0

如果你的问题是“是否有在浏览器用户的方式来选择一个文件夹,并让浏览器上传的所有文件在里面”,那么答案通过浏览器而异。

该标准没有描述将文件夹内容上传到forminput type=file控件的方法。浏览器支持不同:

Google Chrome, which supports folder upload as per this question

Firefox may be able to do something via drag-n-drop

MS Edge browser support is "in development"

浏览器将不会允许任何脚本访问本地文件,而无需用户交互。

如果用户愿意将所有文件拖到浏览器中,或者使用其他程序上传文件,可能会有某些情况,但浏览器向服务器发送文件夹超出了规范。 (在服务器端,是的,您可以选择接受指定路径的多个文件,但浏览器不会将这些文件发送给您,因此您需要在用户端发送特殊编写的程序来发送文件)。

+0

这个示例:ajaxuploader.com/demo/upload-folders.aspx,我们可以上传一个文件夹。 –

+0

@DT好的,这是Chrome特定的补充。查看[关于使用Chrome文件夹上传的问题](/ questions/5826286 /) – Stobor

0

不幸的是,你不能上传文件夹,因为它不是在规格。 但是你不能尝试这个代码。

客户端

<form name="form1" method="post" enctype="multipart/form-data" action="api/upload"> 
     ... 
     <div> 
      <label for="folderName">Folder Name</label> 
      <input name="folderName" type="text" /> 
     </div> 
     <div> 
      <label for="images">Images</label> 
      <!-- you choose multiple files --> 
      <input name="images" type="file" multiple /> 
     </div> 
     ... 
    </form> 

服务器端

// using ASP Logic 
// create folder in your server 
// put uploaded files to the created folder 
// save files info and captions to DB 

关于图片说明,请看看。 Html/PHP - Form - Input as array

+0

此示例:http://ajaxuploader.com/demo/upload-folders.aspx,我们可以上传一个文件夹。 –

相关问题