Korzystam z asp.net mvc 4 webapi beta, aby zbudować usługę odpoczynku. Muszę być w stanie zaakceptować obrazy / pliki POSTed z aplikacji klienckich. Czy jest to możliwe przy użyciu webapi? Poniżej przedstawiam sposób, w jaki aktualnie korzystam. Czy ktoś zna przykład, jak to powinno działać?
[HttpPost]
public string ProfileImagePost(HttpPostedFile profileImage)
{
string[] extensions = { ".jpg", ".jpeg", ".gif", ".bmp", ".png" };
if (!extensions.Any(x => x.Equals(Path.GetExtension(profileImage.FileName.ToLower()), StringComparison.OrdinalIgnoreCase)))
{
throw new HttpResponseException("Invalid file type.", HttpStatusCode.BadRequest);
}
// Other code goes here
return "/path/to/image.png";
}
c#
asp.net-mvc-4
Phil
źródło
źródło
Request.Files
Odpowiedzi:
widzieć http://www.asp.net/web-api/overview/formats-and-model-binding/html-forms-and-multipart-mime#multipartmime , chociaż myślę, że artykuł sprawia, że wydaje się to nieco bardziej skomplikowane niż naprawdę jest.
Gruntownie,
źródło
MultipartFormDataStreamProvider
nie ujawnia jużBodyPartFileNames
własności, użyłemFileData.First().LocalFileName
zamiast tego.Dziwi mnie, że wielu z was chce zapisywać pliki na serwerze. Rozwiązanie, aby zachować wszystko w pamięci, jest następujące:
źródło
File.WriteAllBytes(filename, buffer);
zapisać go do plikuZobacz poniższy kod, zaadaptowany z tego artykułu , który pokazuje najprostszy przykładowy kod, jaki udało mi się znaleźć. Obejmuje przesyłanie plików i pamięci (szybsze).
źródło
Sposób ASP.NET Core jest teraz tutaj :
źródło
Oto szybkie i brudne rozwiązanie, które pobiera przesłaną zawartość pliku z treści HTTP i zapisuje ją w pliku. Do przesłanego pliku dołączyłem fragment kodu HTML / JS „bare bones”.
Metoda interfejsu API sieci Web:
Przesyłanie pliku HTML:
źródło
Użyłem odpowiedzi Mike'a Wassona, zanim zaktualizowałem wszystkie NuGets w moim projekcie webapi mvc4. Kiedy to zrobiłem, musiałem ponownie napisać akcję przesyłania pliku:
Najwyraźniej BodyPartFileNames nie jest już dostępny w MultipartFormDataStreamProvider.
źródło
ReadAsMultipartAsync
i ii) InFile.Move
? 2) Czy możesz to zrobićasync File.Move
?W tym samym kierunku publikuję fragmenty klienta i serwera, które wysyłają pliki Excel za pomocą WebApi, c # 4:
I kontroler webapi serwera:
I niestandardowy MyMultipartFormDataStreamProvider, potrzebny do dostosowania nazwy pliku:
PS: Wziąłem ten kod z innego postu http://www.codeguru.com/csharp/.net/uploading-files-asynchronously-using-asp.net-web-api .htm
źródło
static method SetFile
do kontrolera?path
pamięci w chmurze.źródło
Oto dwa sposoby akceptacji pliku. Jeden używa w dostawcy pamięci MultipartMemoryStreamProvider i jeden używa MultipartFormDataStreamProvider, który zapisuje na dysku. Uwaga: dotyczy to tylko jednego przesłanego pliku na raz. Możesz z pewnością rozszerzyć to, aby zapisać wiele plików. Drugie podejście może obsługiwać duże pliki. Testowałem pliki powyżej 200 MB i działa dobrze. Korzystanie z metody pamięci nie wymaga zapisywania na dysku, ale spowoduje wyłączenie wyjątku pamięci, jeśli przekroczysz określony limit.
źródło
Miałem podobny problem z podglądem interfejsu API sieci Web. Nie przeniesiono jeszcze tej części do nowego interfejsu API sieci Web MVC 4, ale może to pomaga:
Przesyłanie pliku REST za pomocą HttpRequestMessage lub Stream?
Daj mi znać, mogę jutro usiąść i spróbować wdrożyć go ponownie.
źródło
To pytanie ma wiele dobrych odpowiedzi nawet dla .Net Core. Używałem obu frameworów, pod warunkiem że próbki kodu działają poprawnie. Więc nie powtórzę tego. W moim przypadku ważną rzeczą było, jak korzystać z akcji wysyłania plików za pomocą Swaggera :
Oto moje podsumowanie:
ASP .Net WebAPI 2
.NET Core
źródło
Kontroler API:
źródło
Uzupełnienie odpowiedzi Matta Freara - byłaby to alternatywa ASP NET Core do odczytu pliku bezpośrednio ze strumienia, bez zapisywania i odczytu z dysku:
źródło