: 나는 본질적으로 무엇을 수집 할 수 있습니다에서
당신은 당신이
public bool IsValid(HttpPostedFile file)
{
var validExtensions = { ".jpg", ".gif", ".png" };
var fileExtension = System.IO.Path.GetExtension(file.FileName);
if (Array.IndexOf(validExtensions, fileExtension.ToLower()) < 0)
{
return false;
}
var size = file.ContentLength/1024;
if (size == 0 || size > 2024)
{
return false;
}
}
private bool TryUploadFile(HttpPostedFile file, out string filename)
{
var path = Server.MapPath(".") + "\\newspic\\";
filename = path + System.IO.Path.GetFileName(file.FileName);
if (!IsValid(file))
{
return false;
}
try
{
file.SaveAs(filename);
}
catch (HttpException)
{
return false;
}
}
private bool TryInsertFile(string title, string text, string id_writer, string filename)
{
using (var conn = new SqlConnection("<connectionString>"))
{
try
{
var now = DateTime.Now;
conn.Open();
var qry = "INSERT INTO tbl (title, day, month, year, text, id_writer, pic)" +
"VALUES (@title, @day, @month, @year, @text, @id_write, @pic)"
var cmd = new SqlCommand()
cmd.Parameters.Add(new SqlParameter("@title", title));
cmd.Parameters.Add(new SqlParameter("@day", now.Day));
cmd.Parameters.Add(new SqlParameter("@month", now.Month));
cmd.Parameters.Add(new SqlParameter("@year", now.Year));
cmd.Parameters.Add(new SqlParameter("@text", text));
cmd.Parameters.Add(new SqlParameter("@id_writer", id_writer));
cmd.Parameters.Add(new SqlParameter("@pic", filename));
cmd.ExecuteNonQuery();
}
catch (SqlException)
{
return false;
}
}
}
편집 같은 것을 끝낼 그냥 몇 가지 조정과 함께, 그래서 이미 그것의 대부분을 갖고있는 것 같다
public void UploadFile()
{
var file = FileUpload1.PostedFile;
var title = TextBox1.Text;
var text = TextBox2.Text;
var id_writer = Session["is_login"];
var filename = string.Empty;
if (TryUploadFile(file, out filename))
{
if (!TryInsertFile(title, text, id_writer, filename))
{
File.Delete(filename);
}
}
}
원하는 파일 이름은 삽입 된 행의 ID에 의존하기 때문에 명시 적 데이터베이스 트랜잭션을 사용하는 단일 메소드에 있습니다.
private void UploadPicture(HttpPostedFile file, string title, string text, string id_writer)
{
if (!IsValid(file)) return;
using (var conn = new SqlConnection(/* connection string */))
{
conn.Open();
// begin a transaction which will be rolled back if not committed
using (var tx = conn.BeginTransaction())
{
var now = DateTime.Now;
var insert = "INSERT INTO tbl (title, day, month, year, text, id_writer, pic)" +
"VALUES (@title, @day, @month, @year, @text, @id_write, @pic);" +
"SELECT SCOPE_IDENTITY();";
var update = "UPDATE tbl SET pic = @pic WHERE id = @id";
var insertCommand = new SqlCommand(insert);
var updateCommand = new SqlCommand(update);
// insert the row for the uploaded file
insertCommand.Parameters.Add(new SqlParameter("@title", title));
insertCommand.Parameters.Add(new SqlParameter("@day", now.Day));
insertCommand.Parameters.Add(new SqlParameter("@month", now.Month));
insertCommand.Parameters.Add(new SqlParameter("@year", now.Year));
insertCommand.Parameters.Add(new SqlParameter("@text", text));
insertCommand.Parameters.Add(new SqlParameter("@id_writer", id_writer));
// get the identity of the inserted row
var identity = Convert.ToInt32(insertCommand.ExecuteScalar());
// get the filename appending the identity
var path = Server.MapPath(".") + "\\newspic\\";
var filename = path + System.IO.Path.GetFileName(file.FileName) + identity;
// update the row with the filename
updateCommand.Parameters.Add(new SqlParameter("@pic", filename));
updateCommand.Parameters.Add(new SqlParameter("@id", identity));
updateCommand.ExecuteNonQuery();
// save the file
file.SaveAs(filename);
// all done so commit
tx.Commit();
}
}
}
따라서 데이터베이스 트랜잭션이 실패하면 그림을 업로드하지 않으셔도됩니다. 그리고 사진이 업로드되지 않으면 데이터베이스 트랜잭션을 커밋 (또는 롤백)하지 않으시겠습니까? –
서버에 저장된 그림과 오류가 발생하면 대부분의 작업이 롤백되고 그림이 제거됩니다. 그림 주소는 null 일 수 있습니다. – nimaSadeghpour