각 요청에 따라.파일
ASP.NET MVC에서 여러 개의 파일을 업로드하려고 하는데 컨트롤러의 루프마다 이와 같은 단순성이 있습니다.
foreach (HttpPostedFileBase f in Request.Files)
{
if (f.ContentLength > 0)
FileUpload(f);
}
이전 코드에서 다음 오류가 발생합니다.
Unable to cast object of type 'System.String' to type 'System.Web.HttpPostedFile'.
제가 이해할 수 없는 것은 왜 요청하느냐는 것입니다.Files[1]은 HttpPostedFileBase를 반환하지만 반복되면 문자열(파일 이름으로 추정)을 반환합니다.
참고: for 루프로 해결할 수 있다는 것을 알고 있습니다.또한, 저는 HttpPostedFile을 사용하려고 시도했는데, 같은 오류가 발생했습니다.
의 열거자HttpFileCollection
파일의 키(이름)를 반환합니다. 파일의 키(이름)는 반환하지 않습니다.HttpPostedFileBase
물건들.일단 키를 얻으면,Item
([]
) 키(키)가 있는 속성은 다음과 같습니다.HttpPostedFileBase
물건.
foreach (string fileName in Request.Files)
{
HttpPostedFileBase file = Request.Files[fileName];
...
}
내 탭에서 HTML은 다음과 같습니다.
<input class="valid" id="file" name="file" multiple="" type="file">
부탁한다.파일의 이름이 배열에 중복됩니다.따라서 다음과 같이 해결해야 합니다.
for (int i = 0; i < Request.Files.Count; i++ ){
HttpPostedFileBase fileUpload = Request.Files[i];
LINQ를 사용하여 이 작업을 수행하고 요청에 따라 각 작업에 사용할 수 있습니다.
var files = Enumerable.Range(0, Request.Files.Count)
.Select(i => Request.Files[i]);
foreach (var file in files)
{
// file.FileName
}
@tvanfosson이 말했듯이 열거자는 파일 이름을 문자열로 반환합니다.HttpPostedFileBase
이 방법HttpPostedFileBase this[string name]
원하는 객체를 반환합니다.한다면HttpFileCollectionBase
실행된IEnumerable<HttpPostedFileBase>
그러면 우리는 각자 정상적으로 할 수 있습니다.그러나 비제너릭을 구현합니다.IEnumerable
.
다음과 같이 문자열을 반복하여 HttpPostedFile에 캐스팅할 수 있습니다.
foreach (string file in Request.Files)
{
HttpPostedFile hFile = Request.Files[file] as HttpPostedFile;
if (hFile.ContentLength > 0)
FileUpload(hFile);
}
불행하게도 tvanfosson의 대답은 나에게 통하지 않았습니다.파일을 업로드하는 데 문제가 없고 오류도 발생하지 않지만 파일 중 하나만 사용하는 문제가 발생하므로 동일한 파일을 두 개 모두 사용하는 대신 두 번 저장할 수 있습니다.
요청에 있는 각 파일의 이름을 각 문이 반복해서 표시하는 것이 문제인 것 같습니다.파일, 어떤 이유에서인지 키로 작동하지 않았고 매번 첫 번째 파일만 선택되었습니다.
HttpFileCollectionBase files = Request.Files;
for(var i = 0; i < files.Count; i++)
{
HttpPostedFileBase file = files[i];
...
}
다음 코드가 저에게 효과가 있었습니다.
HttpResponseMessage result = null;
var httpRequest = System.Web.HttpContext.Current.Request;
HttpFileCollection uploadFiles = httpRequest.Files;
var docfiles = new List<string>();
if (httpRequest.Files.Count > 0){
int i;
for (i = 0; i < uploadFiles.Count; i++) {
HttpPostedFile postedFile = uploadFiles[i];
var filePath = @"C:/inetpub/wwwroot/test1/reports/" + postedFile.FileName;
postedFile.SaveAs(filePath);
docfiles.Add(filePath);
}
result = Request.CreateResponse(HttpStatusCode.Created, docfiles);
} else {
result = Request.CreateResponse(HttpStatusCode.BadRequest);
}
return result;
}
다음 정보를 얻을 수 있습니다.HttpPostedFile
의 범위 밖에HttpFileCollection
사용.foreach
다음과 같이:
foreach (var obj in fileCollection)
{
HttpPostedFile file = fileCollection.Get(obj.ToString());
}
언급URL : https://stackoverflow.com/questions/1760510/foreach-on-request-files
'programing' 카테고리의 다른 글
mysqdump는 MariaDB 5.5의 데이터베이스에 테이블을 덤프하지 않습니다. (0) | 2023.06.08 |
---|---|
모카 유닛 테스트에 대한 사용자 정의 오류 메시지와 함께 차이 기대치를 제공하는 방법은 무엇입니까? (0) | 2023.06.08 |
__init__(유닛 테스트용).테스트 케이스 (0) | 2023.06.08 |
Oracle DB에 연결할 때 네트워크 어댑터가 연결을 설정할 수 없습니다. (0) | 2023.06.08 |
빈 값을 nan 대신 빈 문자열로 읽으려면 pandas.read_csv를 가져옵니다. (0) | 2023.06.08 |