shaprpuff Ответов: 2

Загрузка файлов работает на локальном хосте, но не работает удаленно после публикации на IIS?


Файл не найден в iis, но загружается в localhost.

Ошибка:

System.IO.FileNotFoundException: Could not find file 'C:\Users\...



System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy, Boolean useLongPath, Boolean checkHost) at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access) at WebPages_frmAddSoftware.ConvertClientImageTo_base64String(HttpPostedFile file) at WebPages_frmAddSoftware.btnUpload_Click(Object sender, EventArgs e) 


Что я уже пробовал:

protected void btnUpload_Click(object sender, EventArgs e)
   {
       try
       {

           if (btnFileUpload.HasFile == true  )
           {

               List<string> extentions = new List<string> { ".jpg", ".gif", ".png" };

               if (extentions.Contains(  Path.GetExtension(btnFileUpload.FileName).ToLower()))
               {
                   lblError.Visible = false;

                   // Get Client side full Image path need to be convert into HttpPostedFile
                   HttpPostedFile file = (HttpPostedFile)btnFileUpload.PostedFile;

                   //get file extention

                   image_base64String = ConvertClientImageTo_base64String(file);

                   imgSoftLogo.Src = @"data:image/gif;base64," + image_base64String;

                   Session["image"] = image_base64String;

               }


               else
               {

                   lblError.ForeColor = System.Drawing.Color.Red;
                   lblError.Text = "Please Upload Valid File.";
               }


           }

       }
       catch (Exception ex) { lblPublish0.Text= ex.ToString(); }
   }



public string ConvertClientImageTo_base64String(HttpPostedFile file)
   {
       byte[] byteArray = null;

       file = (HttpPostedFile)btnFileUpload.PostedFile;

       //Use FileStream to convert the image into byte.
       using (FileStream fs = new FileStream(file.FileName, FileMode.Open, FileAccess.Read))
       {
           byteArray = new byte[fs.Length];
           int iBytesRead = fs.Read(byteArray, 0, (int)fs.Length);
           if (byteArray != null && byteArray.Length > 0)
           {
               // Convert the byte into image
               image_base64String = Convert.ToBase64String(byteArray, 0, byteArray.Length);
           }
           return image_base64String;
       }
   }

Richard MacCutchan

Делает C:\Users\... существуют на вашем веб-сервере?

shaprpuff

изображение загружается клиентским компьютером так что каждый раз 'C:\Users\abc\Desktop\pic.png-это другое

Richard MacCutchan

Конечно, это так, но это не имеет никакого отношения к вашей проблеме.

2 Ответов

Рейтинг:
18

F-ES Sitecore

file.FileName


Это будет просто ". myimage.jpg", так куда же, по-вашему, пойдет файл, Когда вы просто сохраните его? "myimage.jpg"? В какую папку он попадет? Похоже, что он по умолчанию находится в папке для пользователя, под которым работает учетная запись, и там, несомненно, есть проблемы с безопасностью. Вы должны указать полный явный путь к изображению и сохранить его где-нибудь в вашем веб-пространстве, к которому у вас есть доступ на запись, например в папке app_data

string filename = Server.MapPath(Path.Combine("~/App_Data", file.Filename));


Или если вы хотите серверить изображения непосредственно вы можете поместить их в определенную папку которую вы создали

string filename = Server.MapPath(Path.Combine("~/uploads", file.Filename));


Рейтинг:
10

Richard Deeming

В зависимости от браузера FileName свойство возвращает либо имя файла, либо путь к нему на компьютере пользователя.

Ваш код работает на сервере Даже если вы получите полный путь к файлу в системе пользователя, он почти наверняка не существует на сервере. И даже если бы это было так, он не будет содержать того же содержания.

Может быть появиться для работы при отладке кода в Visual Studio или на компьютере. Но это только потому, что в данном конкретном случае сервер и клиент одинаковы.

Вам нужно либо сохранить файл где-нибудь на сервере, либо использовать InputStream свойство для чтения содержимого файла.

public string ConvertClientImageTo_base64String(HttpPostedFile file)
{
    int length = (int)file.InputStream.Length;
    if (length == 0) return string.Empty;
    
    byte[] byteArray = new byte[length];
    file.InputStream.Read(byteArray, 0, length);
    return Convert.ToBase64String(byteArray);
}

private static readonly ICollection<string> AllowedExtensions = new HashSet<string>(StringComparer.OrdinalIgnoreCase)
{
    ".jpg", ".gif", ".png"
};

protected void btnUpload_Click(object sender, EventArgs e)
{
    try
    {
        if (btnFileUpload.HasFile)
        {
            if (AllowedExtentions.Contains(Path.GetExtension(btnFileUpload.FileName)))
            {
                HttpPostedFile file = btnFileUpload.PostedFile;
                string base64String = ConvertClientImageTo_base64String(file);
                Session["image"] = base64String;
                
                // TODO: Specify the correct MIME type for the image:
                imgSoftLogo.Src = @"data:image/gif;base64," + base64String;
                
                lblError.Visible = false;
            }
            else
            {
                lblError.ForeColor = System.Drawing.Color.Red;
                lblError.Text = "Please Upload Valid File.";
            }
        }
    }
    catch (Exception ex) 
    {
        lblPublish0.Text= ex.ToString(); 
    }
}


Karthik_Mahalingam

5