Невозможно обновить изображение в formview

мне понадобится твоя помощь. Я написал код для обновления изображения в форме. Все работает нормально. Но при загрузке изображения из любого другого места на компьютере я сразу же нажимаю на кнопку «Обновить» и получаю сообщение об ошибке: «Не удалось найти файл C: \ Program Files \ IIS Express \ FariPassport.jpg». Это моя страница aspx:

                        <tr style = "align-content:center">
                            <%--<th>Passport:
                            </th>--%>
                            <td>
                                <asp:Image ID = "imgPicture" runat = "server" ImageUrl='<%# Eval("ID","ShowImage.ashx?ID = {0}") %>' Width = "128px" Height = "128px" />
                        </tr>

                        </td>
                    </tr>
                    <tr>
                        <td align = "center">
                            <asp:Button ID = "Button1" runat = "server" Text = "Edit" CommandName = "Edit" CssClass = "btn-danger" Font-Size = "Large" Height = "30px" Width = "82px" />
                            <%--<asp:LinkButton ID = "lnkEdit" runat = "server" CommandName = "Edit" Text = "Edit" CssClass = "btn-link" />--%>
                        </td>
                        <%--<td align = "center">
                            <asp:LinkButton ID = "lnkDelete" runat = "server" CommandName = "Delete" Text = "Delete"
                                OnClientClick = "return confirm('Are you sure to delete it completely?');" />
                        </td>--%>
                        <%--<td align = "center">
                            <asp:LinkButton ID = "lnkNew" runat = "server" CommandName = "New" Text = "New" />
                        </td>--%>
                    </tr>
                    </table>
                </ItemTemplate>
                <EditItemTemplate>
                    <table width = "100%" bgcolor = "#FFCC00">
                        <tr>
                            <th>&nbsp;</th>
                            <td>
                                <asp:FileUpload ID = "fupEditImage" runat = "server" />
                                <asp:CustomValidator ID = "cmvImageType" runat = "server" ControlToValidate = "fupEditImage"
                                    ErrorMessage = "File is invalid!" OnServerValidate = "CustomValidator1_ServerValidate"></asp:CustomValidator>
                            </td>
                        </tr>
                        <tr>
                            <td align = "center">

                                <asp:LinkButton ID = "lnkUpdate" runat = "server" CommandName = "Update" Text = "Update" ForeColor = "White" />
                            </td>
                            <td align = "center">
                                <asp:LinkButton ID = "lnkCancel" runat = "server" CommandName = "Cancel" Text = "Cancel"
                                    CausesValidation = "False" ForeColor = "White" />
                            </td>
                        </tr>
                    </table>
                </EditItemTemplate>
                <EditRowStyle BackColor = "#738A9C" Font-Bold = "True" ForeColor = "White" />
                <FooterStyle BackColor = "#F7DFB5" ForeColor = "#8C4510" />
                <HeaderStyle BackColor = "#A55129" Font-Bold = "True" ForeColor = "White" />
                <InsertItemTemplate>
                    <table width = "100%">

                        <tr>
                            <th>Passport:
                            </th>
                            <td>
                                <asp:FileUpload ID = "fupInsertImage" runat = "server" />
                                <asp:CustomValidator ID = "cmvImageType" runat = "server" ControlToValidate = "fupInsertImage"
                                    ErrorMessage = "File is invalid!" OnServerValidate = "CustomValidator1_ServerValidate"></asp:CustomValidator>
                            </td>
                        </tr>
                        <tr>
                            <td align = "center">
                                <asp:LinkButton ID = "lnkInsert" runat = "server" CommandName = "Insert" Text = "Insert" />
                            </td>
                            <td align = "center">
                                <asp:LinkButton ID = "lnkInsertCancel" runat = "server" CommandName = "Cancel" Text = "Cancel"
                                    CausesValidation = "False" />
                            </td>
                        </tr>
                    </table>
                </InsertItemTemplate>
                <PagerStyle HorizontalAlign = "Center" ForeColor = "#8C4510" />
                <RowStyle BackColor = "#FFF7E7" ForeColor = "#8C4510" />
            </asp:FormView>
            <asp:SqlDataSource ID = "SqlDSPersonDetails" runat = "server" ConnectionString = "<%$ ConnectionStrings:NNPC-ChevronScholarshipConnectionString %>" SelectCommand = "SELECT [ID], [PassportFileName], [PassportImageType], [Passport] FROM [Candidates] WHERE ([UserId] = @UserId)"
                DeleteCommand = "DELETE FROM Candidates WHERE (ID = @ID)" InsertCommand = "INSERT INTO tb_personInfo(PassportFileName, Passport, PassportImageType) VALUES (@PassportFileName, @Passport, @PassportImageType)"
                UpdateCommand = "UPDATE Candidates SET PassportImageType = @PassportImageType, Passport = @Passport  WHERE (ID = @ID)" OnSelecting = "SqlDSPersonDetails_Selecting">
                <DeleteParameters>
                    <asp:Parameter Name = "ID" Type = "Int32" />
                </DeleteParameters>
                <InsertParameters>
                    <asp:Parameter Name = "PassportFileName" Type = "String" />
                    <asp:Parameter Name = "Passport" DbType = "Binary" ConvertEmptyStringToNull = "true" />
                    <asp:Parameter Name = "PassportImageType" Type = "String" ConvertEmptyStringToNull = "true" />
                </InsertParameters>
                <SelectParameters>
                    <asp:Parameter Name = "UserId" Type = "Object" />
                </SelectParameters>

                <UpdateParameters>
                    <%--<asp:Parameter Name = "PassportFileName" Type = "String" />--%>
                    <asp:Parameter Name = "PassportImageType" Type = "String" ConvertEmptyStringToNull = "true" />
                    <asp:Parameter Name = "Passport" DbType = "Binary" ConvertEmptyStringToNull = "true" />
                    <asp:Parameter Name = "ID" Type = "Int32" />
                </UpdateParameters>

            </asp:SqlDataSource>

        </div>




Below is my line of code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data.SqlClient;
using System.IO;
using System.Web.Security;

public partial class ORMApp_PassportUpdate : System.Web.UI.Page
{
    // Static types of common images for checking.
    private static List<string> imgytpes = new List<string>()
        {
            ".BMP",".GIF",".JPG",".PNG"
        };

    protected void Page_Load(object sender, EventArgs e)
    {

    }


    protected void SqlDSPersonDetails_Selecting(object sender, SqlDataSourceSelectingEventArgs e)
    {
        // Get a reference to the currently logged on user
        MembershipUser currentUser = Membership.GetUser();

        // Determine the currently logged on user's UserId value

        Guid currentUserId = (Guid)currentUser.ProviderUserKey;

        // Assign the currently logged on user's UserId to the @UserId parameter

        e.Command.Parameters["@UserId"].Value = currentUserId;
    }



    protected void fvPersonDetails_ItemInserting(object sender, FormViewInsertEventArgs e)
    {

    }


    protected void fvPersonDetails_ItemUpdating(object sender, FormViewUpdateEventArgs e)
    {
        CustomValidator cv = fvPersonDetails.FindControl("cmvImageType") as CustomValidator;

        cv.Validate();
        e.Cancel = !cv.IsValid;

        FileUpload fup = (FileUpload)fvPersonDetails.FindControl("fupEditImage");

        if (cv.IsValid && fup.PostedFile.FileName.Trim() != "")
        {
            e.NewValues["Passport"] = File.ReadAllBytes(fup.PostedFile.FileName);
            e.NewValues["PassportImageType"] = fup.PostedFile.ContentType;
        }
    }

    protected void CustomValidator1_ServerValidate(object source, ServerValidateEventArgs args)
    {
        if (args.Value != null && args.Value != "")
        {
            args.IsValid = imgytpes.IndexOf(System.IO.Path.GetExtension(args.Value).ToUpper()) >= 0;
        }
    }

    protected void fvPersonDetails_ItemUpdated(object sender, FormViewUpdatedEventArgs e)
    {

    }

    protected void fvPersonDetails_ItemInserted(object sender, FormViewInsertedEventArgs e)
    {

    }


    protected void fvPersonDetails_ItemDeleted(object sender, FormViewDeletedEventArgs e)
    {

    }


    protected void fvPersonDetails_ItemDeleting(object sender, FormViewDeleteEventArgs e)
    {

    }

    protected void fvPersonDetails_ModeChanging(object sender, FormViewModeEventArgs e)



    }
}

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

Tetsuya Yamamoto 28.08.2018 03:37

@TetsuyaYamamoto, спасибо за ответ. Это строка 58: e.NewValues ​​["Passport"] = File.ReadAllBytes (fup.PostedFile.FileName) ;. За исключением того, что я поместил изображение в папку IISExpress, а это не то, что я хочу. Всякий раз, когда я пытаюсь из другого места, я получаю сообщение об ошибке - Ошибка сервера в приложении '/'. Не удалось найти файл «C: \ Program Files \ IIS Express \ DivinePass.jpg».

Paschal 28.08.2018 19:08
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
79
1

Ответы 1

Эта строка пытается прочитать PostedFile как локальный файл на веб-сервере, который не найден для некоторых файлов, потому что файл не хранится в папке сервера или путь не существует:

e.NewValues["Passport"] = File.ReadAllBytes(fup.PostedFile.FileName);

Вы можете прочитать загруженный файл из свойства PostedFile.InputStreamFileUpload как экземпляр Stream и назначить его массиву байтов (предполагается, что e.NewValues["Passport"] является массивом байтов):

var stream = fup.PostedFile.InputStream; // creates the stream
stream.Read(e.NewValues["Passport"], 0, stream.Length);

Кроме того, вместо проверки имени файла вы можете проверить загруженный файл, используя свойства HasFile и PostedFile.ContentLength:

if (cv.IsValid && fup.HasFile && fup.PostedFile.ContentLength > 0)
{
    var stream = fup.PostedFile.InputStream; // creates the stream
    stream.Read(e.NewValues["Passport"], 0, stream.Length);

    e.NewValues["PassportImageType"] = fup.PostedFile.ContentType;
}

Если вам нужно сохранить загруженный файл, используйте fup.PostedFile.SaveAs(Path.Combine(@"\path\to\folder", fup.PostedFile.FileName));, а затем Server.MapPath("~/path/to/folder/filename.jpg"), чтобы прочитать его.

Связанная проблема:

Элемент управления загрузкой файла ASP.NET/VB.NET

Другие вопросы по теме