【问题标题】:StreamReader is nullStreamReader 为空
【发布时间】:2016-07-30 20:07:22
【问题描述】:

我使用表单将文件和选项字段发布到控制器。 我将 HttpPostedFileBase 文件传递​​给 3 个方法。其中两个不是空的,但在最后一个是空的。我不会在任何地方给它赋值。 这是代码...

我的表格

<form onsubmit="return check();" action="" method="post" enctype="multipart/form-data" class="form-inline">
    <div class="form-group">
        <label for="languages">Choose the language combination for translating the E BOOK </label>
        <select class=" input-large" name="languages" id="languages">

            <option value="en-fr">ENGLISH TO FRENCH</option>
            <option value="en-de">ENGLISH TO GERMAN</option>
            <option value="en-pt">ENGLISH TO PORTUGUESE</option>
            <option value="en-ru">ENGLISH TO RUSSIAN</option>
            <option value="en-sr">ENGLISH TO SERBIAN</option>
            <option value="en-es">ENGLISH TO SPANISH</option>
            <option value="fr-en">FRENCH TO ENGLISH</option>
            <option value="de-en">GERMAN TO ENGLISH</option>
            <option value="de-sr">GERMAN TO SERBIAN</option>
            <option value="pt-en">PORTUGUESE TO ENGLISH</option>
            <option value="ru-en">RUSSIAN TO ENGLISH</option>
            <option value="es-en">SPANISH TO ENGLISH</option>
        </select>
    </div>


    <div class="form-inline">
        <input type="file" class="btn btn-success" name="file" id="file" accept="text/plain, application/pdf">
        <input type="submit" class="btn btn-success" value="Upload PDF/TXT document" name="submit">
    </div>
</form>

这是控制器中处理表单的部分

这是我的整个控制器类

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net.Mail;
using System.Web;
using System.Web.Mvc;
using System.Data;

namespace TranslationEmbedder.Controllers
{
    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            return View();
        }

        [HttpPost]
        public ActionResult Index(HttpPostedFileBase file, string languages)
        {

            if (file != null)
            {
                if (file.ContentLength > 0)
                {
                    //var fileName = Path.GetFileName(file.FileName);
                    var fileNameNoExtension = Path.GetFileNameWithoutExtension(file.FileName);
                    //var path = Path.Combine(Server.MapPath("~/App_Data/uploads"), fileName);
                    //file.SaveAs(path);
                    HashSet<string> set=null;
                    var fileExtension = Path.GetExtension(file.FileName);

                    if (fileExtension.ToLower().Equals(".txt"))
                    {
                        set = HomeController.geUniqueWordsInEbook(file);
                    }

                    if (fileExtension.ToLower().Equals(".pdf"))
                    {
                        set = HomeController.geUniqueWordsInEbookPdf(file);
                    }

                    if (set == null)
                    {
                        return RedirectToAction("Index");
                    }

                    Dictionary<string, string> dic = HomeController.LoadCsvDictionary(set, languages);

                    if (fileExtension.ToLower().Equals(".txt"))
                    {
                        Response.Clear();
                        Response.AddHeader("Content-Disposition", "attachment; filename=" + fileNameNoExtension + ".html");
                        Response.ContentType = "text/html";
                        HomeController.writeHtmlEbookFromTxt(file, dic, languages);
                        Response.End();
                    }

                    if (fileExtension.ToLower().Equals(".pdf"))
                    {
                        Response.Clear();
                        Response.AddHeader("Content-Disposition", "attachment; filename=" + fileNameNoExtension + ".html");
                        Response.ContentType = "text/html";
                        writeHtmlEbookFromPdf(file, dic, languages);
                        Response.End();
                    }


                    // Not sure what else to do here
                    return Content(String.Empty);



                }
            }

            return RedirectToAction("Index");
        }

        private void writeHtmlEbookFromPdf(HttpPostedFileBase file, Dictionary<string, string> dic,string languageCode)
        {


        }

        private static  void writeHtmlEbookFromTxt(HttpPostedFileBase file, Dictionary<string, string> dic, string languageCode)
        {


                var fileNameNoExtension = Path.GetFileNameWithoutExtension(file.FileName);

                    System.Web.HttpContext.Current.Response.Write("");
                    System.Web.HttpContext.Current.Response.Write("<!DOCTYPE html><html>");
                    System.Web.HttpContext.Current.Response.Write("<head><META HTTP-EQUIV='content-type' CONTENT='text/html; charset=utf-8'><title>" + fileNameNoExtension + "</title>");
                    System.Web.HttpContext.Current.Response.Write("<script>");
                    System.Web.HttpContext.Current.Response.Write("function speakIt(b)");
                    System.Web.HttpContext.Current.Response.Write("{");
                    System.Web.HttpContext.Current.Response.Write("if (document.getElementById(\"myCheck\").checked) {");
                    System.Web.HttpContext.Current.Response.Write("if ('speechSynthesis' in window) {");
                    System.Web.HttpContext.Current.Response.Write("var sometext=b;");
                    System.Web.HttpContext.Current.Response.Write("var msg = new SpeechSynthesisUtterance();");
                    System.Web.HttpContext.Current.Response.Write("var voices = window.speechSynthesis.getVoices();");
                    System.Web.HttpContext.Current.Response.Write("msg.text = sometext;");


                    string[] toSpeak = languageCode.Split('-');

                    switch (toSpeak[0])
                    {
                        case "de"://German
                            languageCode = "de-DE";
                            break;
                        case "en"://English
                            languageCode = "en-GB";
                            break;
                        case "es"://Spanish
                            languageCode = "es-ES";
                            break;
                        case "fr"://French
                            languageCode = "fr-FR";
                            break;
                        case "ru"://Russian
                            languageCode = "ru";
                            break;
                        case "pt"://Portuguese - Portugal
                            languageCode = "pt-PT";
                            break;
                        case "sr"://Serbian
                            languageCode = "sr-SP";
                            break;
                        case "ja"://Japanese
                            languageCode = "ja";
                            break;
                        case "he"://Hebrew
                            languageCode = "he";
                            break;
                        case "it"://Italian - Italy
                            languageCode = "it-IT";
                            break;
                        case "el"://Greek
                            languageCode = "el";
                            break;
                        case "zh"://Chinese - China
                            languageCode = "zh-CN";
                            break;
                        case "ar"://Arabic - Egypt
                            languageCode = "ar-EG";
                            break;
                        case "hy"://Armenian
                            languageCode = "hy";
                            break;
                        case "eu"://Basque
                            languageCode = "eu";
                            break;
                        case "be"://Belarusian
                            languageCode = "be";
                            break;
                        case "cs"://Czech
                            languageCode = "cs";
                            break;
                        case "da"://Danish
                            languageCode = "da";
                            break;
                        case "et"://Estonian
                            languageCode = "et";
                            break;
                        case "mk"://FYRO Macedonia
                            languageCode = "mk";
                            break;
                        case "hu"://Hungarian
                            languageCode = "hu";
                            break;
                        case "is"://Icelandic
                            languageCode = "is";
                            break;
                        case "hi"://Hindi
                            languageCode = "hi";
                            break;
                        case "id"://Indonesian
                            languageCode = "id";
                            break;
                        case "kk"://Kazakh
                            languageCode = "kk";
                            break;
                        case "ko"://Korean
                            languageCode = "ko";
                            break;
                        case "lv"://Latvian
                            languageCode = "lv";
                            break;
                        case "lt"://Lithuanian
                            languageCode = "lt";
                            break;
                        case "pl"://Polish
                            languageCode = "pl";
                            break;
                        case "sk"://Slovak
                            languageCode = "sk";
                            break;
                        case "sl"://Slovenian
                            languageCode = "sl";
                            break;
                        case "sv"://Swedish - Sweden
                            languageCode = "sv-SE";
                            break;
                        case "tr"://Turkish
                            languageCode = "tr";
                            break;
                        case "uk"://Ukrainian
                            languageCode = "uk";
                            break;
                        case "vi"://Vietnamese
                            languageCode = "vi";
                            break;
                        //...add more language support
                        default:
                            languageCode = "de-DE";
                            break;
                    }

                    System.Web.HttpContext.Current.Response.Write("msg.lang = '" + languageCode + "';");
                    System.Web.HttpContext.Current.Response.Write("speechSynthesis.speak(msg);");
                    System.Web.HttpContext.Current.Response.Write("}");
                    System.Web.HttpContext.Current.Response.Write("}");
                    System.Web.HttpContext.Current.Response.Write("}");

                    System.Web.HttpContext.Current.Response.Write("</script>");

                    System.Web.HttpContext.Current.Response.Write("<style>");

                    System.Web.HttpContext.Current.Response.Write("#ebook {");
                    System.Web.HttpContext.Current.Response.Write(" margin: auto;");
                    System.Web.HttpContext.Current.Response.Write("width: 90%;font-size: 200%;@page {counter-increment: page;counter-reset: page 1;@top-right {content: \"Page \" counter(page) \" of \" counter(pages);}}");
                    System.Web.HttpContext.Current.Response.Write("text-align: left;line-height:1.5;font-family: 'Merriweather', Georgia, 'Times New Roman', Times, serif;");
                    System.Web.HttpContext.Current.Response.Write("vertical-align: middle;");
                    System.Web.HttpContext.Current.Response.Write("word-wrap: break-word;");
                    System.Web.HttpContext.Current.Response.Write("border:3px solid #8AC007;");
                    System.Web.HttpContext.Current.Response.Write("padding: 10px;");
                    System.Web.HttpContext.Current.Response.Write("}");

                    System.Web.HttpContext.Current.Response.Write("#header-wrap {");
                    System.Web.HttpContext.Current.Response.Write("position: fixed;");
                    System.Web.HttpContext.Current.Response.Write("text-align: center;");
                    System.Web.HttpContext.Current.Response.Write("background-color: #8AC007;");
                    System.Web.HttpContext.Current.Response.Write("color: white;");
                    System.Web.HttpContext.Current.Response.Write("height: 25px;");
                    System.Web.HttpContext.Current.Response.Write("top: 0;");
                    System.Web.HttpContext.Current.Response.Write("width: 100%;");
                    System.Web.HttpContext.Current.Response.Write("z-index: 100;");
                    System.Web.HttpContext.Current.Response.Write("}");

                    System.Web.HttpContext.Current.Response.Write("</style>");
                    System.Web.HttpContext.Current.Response.Write("</head><body></br>");

                    System.Web.HttpContext.Current.Response.Write("<div id='header-wrap'></br>");
                    System.Web.HttpContext.Current.Response.Write("<span>ENABLE / DISABLE TEXT TO SPEECH : <input type=\"checkbox\" name=\"myCheck\" id=\"myCheck\" checked=\"checked\"></span></br></br>");
                    System.Web.HttpContext.Current.Response.Write("</div>");

                    System.Web.HttpContext.Current.Response.Write("<div id='ebook'>");




            System.IO.StreamReader reader = new System.IO.StreamReader(file.InputStream);
            string line="";
            while ((line = reader.ReadLine()) != null)
                {


                        string[] words = line.Split(' ');

                        foreach (string word in words)
                        {
                            string cleanWord = word.Replace(".", "").Replace(",", "").Replace(":", "").Replace(";", "").Replace("ß", "ss").Replace("?", "").Replace("!", "").Replace("«", "").Replace("»", "").Replace("[", " ").Replace("]", " ").Replace("(", " ").Replace(")", " ").Replace(",,", " ").Replace("\"", " ").Replace("-", " ").ToLower();
                            string value = "";
                            if (dic.ContainsKey(cleanWord))
                                value = dic[cleanWord];

                            System.Web.HttpContext.Current.Response.Write("<span  onclick =\"alert('" + value + "');speakIt('" + cleanWord + "'); \" >" + " " + word + " " + "</span>");
                        }

                        System.Web.HttpContext.Current.Response.Write("</br>");


                    }
                    System.Web.HttpContext.Current.Response.Write("</div></body></html>");


                reader.Close();




        }
        private static Dictionary<string, string> LoadCsvDictionary(HashSet<string> uniqueEbookWords,string language)
        {

            string languageFile = AppDomain.CurrentDomain.GetData("DataDirectory")+ "\\languages\\"+ language + ".csv";
            Dictionary<string, string> d = new Dictionary<string, string>();



            using (var reader = new StreamReader(System.IO.File.OpenRead(@languageFile)) )
            {

                while (!reader.EndOfStream)
                {
                    var line = reader.ReadLine();
                    var values = line.Split(',');

                    if (uniqueEbookWords.Contains(values[0].ToLower()))
                    {
                        if (!d.ContainsKey(values[0].ToLower()))
                            d.Add(values[0].ToLower(), values[1].ToLower());
                    }

                }


            }


            return d;
        }

        private static HashSet<string> geUniqueWordsInEbook(HttpPostedFileBase file)
        {
            //make two options one for PDF and one for TXT uploaded ebook...
            int counter = 0;
            string line;

            HashSet<string> uniqueWords = new HashSet<string>();

            System.IO.StreamReader file1 =new System.IO.StreamReader(file.InputStream);


            while ((line = file1.ReadLine()) != null)
            {
                string[] words = line.Split(' ');
                foreach (string word in words)
                {
                    string cleanWord = word.Replace(".", "").Replace(",", "").Replace(":", "").Replace(";", "").Replace("ß", "ss").Replace("?", "").Replace("!", "").Replace("«", "").Replace("»", "").Replace("[", " ").Replace("]", " ").Replace("(", " ").Replace(")", " ").Replace(",,", " ").Replace("\"", " ").Replace("-", " ").ToLower();
                    uniqueWords.Add(cleanWord);

                }

                counter++;
            }

            file1.Close();


            return uniqueWords;
        }

        private static HashSet<string> geUniqueWordsInEbookPdf(HttpPostedFileBase file)
        {
            //make two options one for PDF and one for TXT uploaded ebook...
            int counter = 0;
            string line;

            HashSet<string> uniqueWords = new HashSet<string>();

            System.IO.StreamReader file1 = new System.IO.StreamReader(file.InputStream);


            while ((line = file1.ReadLine()) != null)
            {
                string[] words = line.Split(' ');
                foreach (string word in words)
                {
                    string cleanWord = word.Replace(".", "").Replace(",", "").Replace(":", "").Replace(";", "").Replace("ß", "ss").Replace("?", "").Replace("!", "").Replace("«", "").Replace("»", "").Replace("[", " ").Replace("]", " ").Replace("(", " ").Replace(")", " ").Replace(",,", " ").Replace("\"", " ").Replace("-", " ").ToLower();
                    uniqueWords.Add(cleanWord);

                }

                counter++;
            }

            file1.Close();


            return uniqueWords;
        }



        public ActionResult About()
        {
            ViewBag.Message = "Watch a video that will you more about www.TRANSLATION-EMBEDDER.com project.";

            return View();
        }

        public ActionResult Contact()
        {
            ViewBag.Message = "Feel free to contact us";

            return View();
        }

        [HttpPost]
        public ActionResult Contact(string email,string message)
        {

            if (email.Equals(""))
            {
                ViewBag.Message = "You must provide an email";
                return View();
            }

            if (message.Equals(""))
            {
                ViewBag.Message = "You must provide the message";
                return View();
            }

            ViewBag.Message = "The message is sent to us from the user with email: "+ email + ".We will responde as soon as possible. Have a nice day. ";
            sendEmail(email, message);
            return View();
        }

        private void sendEmail(string email, string message)
        {
            //http://stackoverflow.com/questions/18326738/how-to-send-email-in-asp-net-c-sharp

            /*
            SmtpClient smtpClient = new SmtpClient("smtp.gmail.com", 25);

            smtpClient.Credentials = new System.Net.NetworkCredential("jvkrneta@gmail.com", "tijanica");
            smtpClient.UseDefaultCredentials = true;
            smtpClient.DeliveryMethod = SmtpDeliveryMethod.Network;
            smtpClient.EnableSsl = true;
            MailMessage mail = new MailMessage();

            //Setting From , To and CC
            mail.From = new MailAddress(email, "Translation-Embedder.com");
            mail.To.Add(new MailAddress("jvkrneta@gmail.com"));
            mail.Body = message;

            smtpClient.Send(mail);
            */
        }





    }
}   

而且只在方法中

private static  void writeHtmlEbookFromTxt(HttpPostedFileBase file, Dictionary<string, string> dic, string languageCode)

我是否会为 reader 获取 null 并且我的循环文件循环从未运行 这部分:

 System.IO.StreamReader reader = new System.IO.StreamReader(file.InputStream);
            string line="";
            while ((line = reader.ReadLine()) != null)
                {


                        string[] words = line.Split(' ');

                        foreach (string word in words)
                        {
                            string cleanWord = word.Replace(".", "").Replace(",", "").Replace(":", "").Replace(";", "").Replace("ß", "ss").Replace("?", "").Replace("!", "").Replace("«", "").Replace("»", "").Replace("[", " ").Replace("]", " ").Replace("(", " ").Replace(")", " ").Replace(",,", " ").Replace("\"", " ").Replace("-", " ").ToLower();
                            string value = "";
                            if (dic.ContainsKey(cleanWord))
                                value = dic[cleanWord];

                            System.Web.HttpContext.Current.Response.Write("<span  onclick =\"alert('" + value + "');speakIt('" + cleanWord + "'); \" >" + " " + word + " " + "</span>");
                        }

                        System.Web.HttpContext.Current.Response.Write("</br>");


                    }
                    System.Web.HttpContext.Current.Response.Write("</div></body></html>");


                reader.Close();

我尝试了所有方法,但没有看到为什么我在许多方法中使用的相同代码仅在这种情况下为 reader OBJECT 提供 null 的原因。

【问题讨论】:

  • 我怀疑这里还有其他东西是空的。 reader 变量不能为空,因为您在此处为其赋值:new StreamReader(file.InputStream)
  • 这用于解析电子书。首先,我找到所有独特的单词 - 这被放入一个 HashSet 集合中 - 并且 HashSet 被填充(选中)......然后对于这些独特的单词,我得到一个带有翻译的字典(也被填充)。最后,当我要写一本新书时,当我从电子书中获取独特的单词时,我无法解析我已经解析过的同一本书。

标签: c# asp.net-mvc


【解决方案1】:

您不能两次读取文件流。在您的geUniqueWordsInEbook 方法中,您已经阅读了file.InputStream,甚至在最后关闭了它。这就是您无法在writeHtmlEbookFromTxt 方法中第二次阅读它的原因。在读取文件内容时,您需要一次性完成 2 个操作。所以基本上你必须重新组织你的代码,以便在读取文件流时这两个操作发生在一个地方。

如果您不希望上传的文件很大,您可以将它们的内容加载到内存中(在 byte[] 中),您可以通过您的方法传递这些内容。但这对于大文件来说是多余的。

另一种选择是将上传的文件保存到您的网络服务器上的磁盘,然后多次读取此上传的文件。

【讨论】:

  • 有没有办法解决这个问题......只是为了避免大方法
  • 不,没有办法。上传的文件流是转发只读的。一旦你读完它,你就不能再做任何其他事情了。您无法将其反转并再次阅读。另一种可能性是将上传的文件保存在网络服务器的磁盘上,然后多次阅读。
  • 感谢您的快速回复!
【解决方案2】:

希望对你有帮助。

控制器:

[HttpPost]
    public ActionResult Create(HttpPostedFileBase FileData)
    {
        string fpath = "";
        try
        {
            if (Request.Files.Count > 0)
            {
                try
                {

                    HttpPostedFileBase file = FileData;
                    string fname;
                    // want to check extension then use this method
                    //if (CheckExtension(file.ContentType.ToLower()))
                    //{
                        // Checking for Internet Explorer  
                        string extension = System.IO.Path.GetExtension(file.FileName);

                        if (Request.Browser.Browser.ToUpper() == "IE" || Request.Browser.Browser.ToUpper() == "INTERNETEXPLORER")
                        {
                            string[] testfiles = file.FileName.Split(new char[] { '\\' });
                            fname = Guid.NewGuid() + extension; //+ testfiles[testfiles.Length - 1];
                        }
                        else
                        {
                            fname = Guid.NewGuid() + extension; //+ file.FileName;
                        }

                        // Get the complete folder path and store the file inside it.  
                        fname = System.IO.Path.Combine(Server.MapPath("~/Content/"), fname);
                        file.SaveAs(fname);

                        return Content("Successfully Uploaded");
                    //}

                }
                catch (Exception ex)
                {
                    return Content("Error occurred. Error details: " + ex.Message);
                }
            }

        }
        catch (Exception)
        {
            return Content(Response.StatusCode.ToString() + " Bad Requrest error." + fpath);
        }
        return Content("No files selected.");
    }

    public bool CheckExtension(string Ext)
    {
        if (Ext == "application/pdf")
        {
            return true;
        }
        else if (Ext == "text/plain")
        {
            return true;
        }
        else if (Ext == "application/msword")
        {
            return true;
        }
        else if (Ext == "application/vnd.openxmlformats-officedocument.wordprocessingml.document")
        {
            return true;
        }
        else
        {
            return false;
        }
    }

查看:

@using (Html.BeginForm("Create", "Home", null, FormMethod.Post, new { id = "formU", enctype = "multipart/form-data" })){

<div class="modal-body">
    <div class="form-horizontal">
        @Html.ValidationSummary(true)

        <label for="file">Filename:</label>
        <input type="file" name="File" id="File" style="width:240px" />

        <div class="form-group">
            <input id="submit" type="submit" value="Submit" class="btn btn-success" />
        </div>
    </div>
</div>}

你也可以从 git hub 仓库click here下载源代码

【讨论】:

  • 谢谢我去看看!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-08
  • 2014-05-22
  • 2011-08-17
  • 2016-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多