Как получить больше информации из файла InputStremed? - PullRequest
0 голосов
/ 01 сентября 2011

Если я использую InputStream для получения файла, например

HttpContext.Current.Request.InputStream

Как получить дополнительную информацию о файле?

Я могу легко преобразовать поток вphisical File, но, например, откуда мне знать, какое расширение файла используется ?

string fileIn = @"C:\Temp\inputStreamedFile.xxx"; // What extension?

using (FileStream fs = System.IO.File.Create(fileIn))
{
    Stream f = HttpContext.Current.Request.InputStream;
    byte[] bytes = new byte[f.Length];
    f.Read(bytes, 0, (int)f.Length);
    fs.Write(bytes, 0, bytes.Length);
}

Идея, лежащая в основе этого, заключается в том, что при использовании HttpPostedFileBase я всегда получаю нулевое значение:

public ContentResult Send(HttpPostedFileBase fileToUpload, string email)
{
    // Get file stream and save it

    // Get File in stream
    string fileIn = Path.Combine(uploadsPath, uniqueIdentifier),
           fileOut = Path.Combine(convertedPath, uniqueIdentifier + ".pdf");

    // Verify that the user selected a file
    if (fileToUpload != null && fileToUpload.ContentLength > 0)
    {
        // extract only the fielname
        string fileExtension = Path.GetExtension(fileToUpload.FileName);
        fileIn = String.Concat(fileIn, fileExtension);

        fileToUpload.SaveAs(fileIn);
    }

    // TODO: Add Convert File to Batch

    return Content("File queued for process with id: " + uniqueIdentifier);
}

и это то, что я посылаю из командной строки:

$ curl --form email='mail@domain.com' --form fileToUpload='C:\temp\MyWord.docx' http://localhost:64705/send/
File queued for process with id: 1d777cc7-7c08-460c-8412-ddab72408123

переменная email заполнена правильно, но fileToUpload всегда равно нулю.

PS Этого не происходит , если я использую форму для загрузки тех же данных.

Ответы [ 3 ]

1 голос
/ 01 сентября 2011

Единственной проблемой, которую я обнаружил, было использование curl ... Я забыл знак @, в котором упоминается, что загруженная форма будет закодирована как multipart/form-data.

Правильная команда curl для использования HttpPostedFileBase будет:

$ curl --form email='mail@domain.com' 
       --form fileToUpload=@'C:\temp\MyWord.docx' 
       http://localhost:64705/send/
1 голос
/ 01 сентября 2011

Извините, если это не помогает, но зачем использовать InputStream для загрузки загруженных файлов?

Это то, что я обычно делаю:

[HttpPost]
public ActionResult Upload(HttpPostedFileBase[] files) {
    String physicalPath = "c:\\whatever";
    foreach (var file in files) {
        String extension = Path.GetExtension(file.FileName);
        file.SaveAs(physicalPath + "\\" + file.FileName);
    }
    return View();
}
0 голосов
/ 01 сентября 2011

Вы можете получить информацию о размещенном файле из <input type="file" />. Но на самом деле он использует немного другой способ загрузки файлов в asp.net mvc проверить здесь

...