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





Эта строка пытается прочитать 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"), чтобы прочитать его.
Связанная проблема:
Какая строка выдает ошибку? Похоже, вам следует использовать виртуальный путь вместо физического пути из загруженного файла.