2017-02-14 43 views
6

Tôi không thể tìm ra cách viết .NET Web Web API để hỗ trợ Tải lên tệp. Xin lưu ý tôi không sử dụng mẫu ASP.NET Core MVC để tải lên tệp nhưng thông qua một thùng chứa Servlet/JSP. Sau đây là cách của tôi project.json được định nghĩa,.NET Core - Web API - Cách tải tệp lên?

{ 
    "dependencies": { 
    "Microsoft.NETCore.App": { 
     "version": "1.0.1", 
     "type": "platform" 
    }, 
    "Microsoft.AspNetCore.Mvc": "1.0.1", 
    "Microsoft.AspNetCore.Routing": "1.0.1", 
    "Microsoft.AspNetCore.Server.IISIntegration": "1.0.0", 
    "Microsoft.AspNetCore.Server.Kestrel": "1.0.1", 
    "Microsoft.Extensions.Configuration.EnvironmentVariables": "1.0.0", 
    "Microsoft.Extensions.Configuration.FileExtensions": "1.0.0", 
    "Microsoft.Extensions.Configuration.Json": "1.0.0", 
    "Microsoft.Extensions.Logging": "1.0.0", 
    "Microsoft.Extensions.Logging.Console": "1.0.0", 
    "Microsoft.Extensions.Logging.Debug": "1.0.0", 
    "Microsoft.Extensions.Options.ConfigurationExtensions": "1.0.0", 
    "Npgsql": "3.1.9", 
    "CoreCompat.Newtonsoft.Json": "9.0.2-beta001", 
    "Newtonsoft.Json": "9.0.1" 
    }, 

    "tools": { 
    "Microsoft.AspNetCore.Server.IISIntegration.Tools": "1.0.0-preview2-final" 
    }, 

    "frameworks": { 
    "netcoreapp1.0": { 
     "imports": [ 
     "dotnet5.6", 
     "portable-net45+win8" 
     ] 
    } 
    }, 

    "buildOptions": { 
    "emitEntryPoint": true, 
    "preserveCompilationContext": true 
    }, 

    "runtimeOptions": { 
    "configProperties": { 
     "System.GC.Server": true 
    } 
    }, 

    "publishOptions": { 
    "include": [ 
     "wwwroot", 
     "**/*.cshtml", 
     "appsettings.json", 
     "web.config" 
    ] 
    }, 

    "scripts": { 
    "postpublish": [ "dotnet publish-iis --publish-folder %publish:OutputPath% --framework %publish:FullTargetFramework%" ] 
    } 
} 

Dưới đây là làm thế nào tôi Startup được định nghĩa,

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Threading.Tasks; 
using Microsoft.AspNetCore.Builder; 
using Microsoft.AspNetCore.Hosting; 
using Microsoft.Extensions.Configuration; 
using Microsoft.Extensions.DependencyInjection; 
using Microsoft.Extensions.Logging; 

using QCService.Models; 

namespace QCService 
{ 
    public class Startup 
    { 
     public Startup(IHostingEnvironment env) 
     { 
      var builder = new ConfigurationBuilder() 
       .SetBasePath(env.ContentRootPath) 
       .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true) 
       .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true) 
       .AddEnvironmentVariables(); 
      Configuration = builder.Build(); 
     } 

     public IConfigurationRoot Configuration { get; } 

     // This method gets called by the runtime. Use this method to add services to the container. 
     public void ConfigureServices(IServiceCollection services) 
     { 
      // Add framework services. 
      services.AddMvc(); 

      //Add SurveysRepository for Dependency Injection 
      services.AddSingleton<ISurveysRepository, SurveysRepository>(); 
      //Add FeedbacksRepository for Dependency Injection 
      services.AddSingleton<IFeedbacksRepository, FeedbacksRepository>(); 
      //Add AttachmentsRepository for Dependency Injection 
      services.AddSingleton<IAttachmentsRepository, AttachmentsRepository>(); 
     } 

     // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. 
     public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) 
     { 
      loggerFactory.AddConsole(Configuration.GetSection("Logging")); 
      loggerFactory.AddDebug(); 

      app.UseMvc(); 
     } 
    } 
} 

Cuối cùng đây là cách điều khiển của tôi được định nghĩa,

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Threading.Tasks; 
using Microsoft.AspNetCore.Mvc; 
//Including model classes for Attachments 
using QCService.Models; 
using Microsoft.AspNetCore.Http; 
using Microsoft.AspNetCore.Hosting; 
using System.IO; 
using Microsoft.Net.Http.Headers; 

// For more information on enabling Web API for empty projects, visit http://go.microsoft.com/fwlink/?LinkID=397860 

namespace QCService.Controllers 
{ 
    [Route("api/[controller]")] 
    public class AttachmentsController : Controller 
    { 
     public IAttachmentsRepository AttachmentItems { get; set; } 
     public AttachmentsController(IAttachmentsRepository attachmentItems) 
     { 
      AttachmentItems = attachmentItems; 
     } 

     // GET: api/Attachments 
     [HttpGet] /*http://localhost:52770/api/Attachments*/ 
     public IEnumerable<Attachments> Get() 
     { 
      return AttachmentItems.GetAllAttachments(); 
     } 

     // GET api/Attachments/5 
     [HttpGet("{id}")] /*http://localhost:52770/api/Attachments/{AttachmentID}*/ 
     public Attachments Get(int id) 
     { 
      return AttachmentItems.GetAttachment(id); 
     } 

     // GET api/Attachments/5 
     [HttpGet("Feedback/{id}")] /*http://localhost:52770/api/Attachments/Feedback/{FeedbackID}*/ 
     public IEnumerable<Attachments> GetFeedbackAttachments(int id) 
     { 
      return AttachmentItems.GetFeedbackAttachments(id); 
     } 

     // POST api/Attachments 
     [HttpPost]/*http://localhost:52770/api/Attachments/*/ 
     public async Task<IActionResult> PostFiles(ICollection<IFormFile> files) 
     { 
      try 
      { 
       System.Console.WriteLine("You received the call!"); 
       WriteLog("PostFiles call received!", true); 
       //We would always copy the attachments to the folder specified above but for now dump it wherver.... 
       long size = files.Sum(f => f.Length); 

       // full path to file in temp location 
       var filePath = Path.GetTempFileName(); 
       var fileName = Path.GetTempFileName(); 

       foreach (var formFile in files) 
       { 
        if (formFile.Length > 0) 
        { 
         using (var stream = new FileStream(filePath, FileMode.Create)) 
         { 
          await formFile.CopyToAsync(stream); 
          //formFile.CopyToAsync(stream); 
         } 
        } 
       } 

       // process uploaded files 
       // Don't rely on or trust the FileName property without validation. 
       //Displaying File Name for verification purposes for now -Rohit 

       return Ok(new { count = files.Count, fileName, size, filePath }); 
      } 
      catch (Exception exp) 
      { 
       System.Console.WriteLine("Exception generated when uploading file - " + exp.Message); 
       WriteLog("Exception generated when uploading file - " + exp.Message, true); 
       string message = $"file/upload failed!"; 
       return Json(message); 
      } 
     } 

     /// <summary> 
     /// Writes a log entry to the local file system 
     /// </summary> 
     /// <param name="Message">Message to be written to the log file</param> 
     /// <param name="InsertNewLine">Inserts a new line</param> 
     public void WriteLog(string Message, bool InsertNewLine) 
     { 
      LogActivity ologObject = null; 
      try 
      { 
       string MessageString = (InsertNewLine == true ? Environment.NewLine : "") + Message; 
       if (ologObject == null) 
        ologObject = LogActivity.GetLogObject(); 
       ologObject.WriteLog(Message, InsertNewLine); 
      } 
      catch (Exception ex) 
      { 
       Console.WriteLine("Unable to write to the log file : " + ex.Message); 
       Console.WriteLine("Stack Trace : " + ex.StackTrace); 
      } 
     } 
    } 
} 

Tôi đã trải qua điều này li nk, https://docs.microsoft.com/en-us/aspnet/core/mvc/models/file-uploads nhưng không thể hoạt động! Bất kỳ trợ giúp nào được đánh giá cao !!!

Tôi đang sử dụng nâng cao Nghỉ ngơi Khách hàng của Google để gửi dữ liệu như sau, This is how I am sending the POST request

tôi tiếp tục nhận được phản ứng thất bại với thông báo sau ... Tình trạng: 500: Internal Server Error thời gian tải: 62 ms tiêu đề đáp ứng tiêu đề yêu cầu Chuyển hướng Thời gian Content-type: multipart/form-data; ranh giới = ---- WebKitFormBoundary0RKUhduCjSNZOEMN Content-Length: 9106 Nguồn nhắn

POST/api/Attachments HTTP/1.1 XƯỚNG NGÔN VIÊN: localhost: 52.770 content-type: multipart/form-data; ranh giới = ---- WebKitFormBoundary0RKUhduCjSNZOEMN nội dung dài: 9106

------ WebKitFormBoundary0RKUhduCjSNZOEMN Content-Disposition: form-data; name = "fileUpload1"; filename = "1i4ymeoyov_In_the_Wild_Testing.png" Content-Type: image/png

PNG

IHDR, I3 (tEXtSoftwareAdobe ImageReadyqe < iTXtXML: com.adobe.xmp 8 ^ 2IDATx ] pU @ a H Pe P8 Ȉ b ̌3 p q * 7 " h + Yf O atD (< h¦DLXdOH =} } ov8_U ..... ------ WebKitFormBoundary0RKUhduCjSNZOEMN--

+0

Lưu ý rằng trong ASP.NET lõi không có sự phân biệt giữa MVC và API Web (chỉ FYI) .. – ssmith

Trả lời

0

Trong request, URL của bạn không đúng. Kiểm tra tuyến đường trên bộ điều khiển là [Route ("api/[controller]")] và tên phương thức hành động là PostFiles. Vì vậy, URL đúng sẽ http://localhost:52770/api/Attachments/PostFiles

Hoặc sửa URL hoặc đổi tên các phương pháp hành động như Index

+0

Cảm ơn bạn đã trả lời. – Rohit

+0

Tôi đã thử cả hai cách nhưng không may mắn. Nếu tôi sử dụng URL dưới dạng 'http: // localhost: 52770/api/Attachments/PostFiles', tôi nhận được HTTP 404 làm phản hồi. Nếu tôi xác định lại phương thức hành động là Chỉ mục thì tôi nhận được '500: Lỗi Máy chủ Nội bộ' làm phản hồi. Xin lưu ý rằng tôi đã cập nhật tên của tham số thành tệp khi chọn tệp trong 'ARC của Google' được sử dụng để đăng yêu cầu lên .NET Web Web API. – Rohit

+0

Nếu bạn sử dụng tên phương thức hành động làm Chỉ mục, bạn có thể truy cập phương pháp hành động để gỡ lỗi không? Một điều nữa, Path.GetTempFileName() tạo một tệp tạm thời trong thư mục tạm thời của người dùng. Ứng dụng có thể không được phép làm như vậy. Hãy thử một đường dẫn khác var uploads = Path.Combine (_environment.WebRootPath, "uploads"); foreach (var tệp trong tệp) {if (file.Length> 0) {using (var fileStream = new FileStream (Path.Combine (uploads, file.FileName), FileMode.Create)) { đang chờ tệp .opyToAsync (fileStream);} } } –

0

Tôi nghĩ vấn đề của bạn là do một lỗi trong chrome 56.

ARC can't send files on new Chrome version: 56.0.2924.76

Vấn đề này ảnh hưởng đến cả hai người đưa thư và ChromeRestClient

Cách giải quyết đơn giản là kích hoạt tùy chọn Use XHR và loại bỏ các tiêu đề Content-Type: multipart/form-data.

Điều này phù hợp cho cả người đưa thư và chrome

4

Đây là nguyên nhân gốc: biểu mẫu dữ liệu; name = "fileUpload1"

Tên của bạn "fileUpload1" phải là "tác phẩm" mà phù hợp với tuyên bố của PostFiles hành động (ICollection < IFormFile> files)

Các vấn đề liên quan