2010-01-27 3 views
0

게시 후 동일한 질문을 다시 게시하면 질문을 편집 할 수 없으므로 다시 게시하십시오. 이 질문을 전에 읽은 경우 특히 하단을 읽으십시오. -비록 vb.net이지만 sql 서버에 이미지 파일을 업로드하는 동안 멈추었습니다.

오케이 이것이이 사이트에서 사용한 코드입니다.

With cmdInsertAttachment 
    .Parameters("@FileName").Value = sFileName 
    .Parameters("@FileSize").Value = iLength 
    .Parameters("@FileData").Value = bytContent 
    .Parameters("@ContentType").Value = sContentType 
    .ExecuteNonQuery() 
End With 
-

Private Sub btnAttach_Click(ByVal sender As System.Object, _ 
ByVal e As System.EventArgs) Handles btnAttach.Click 
    Dim iLength As Integer = CType(File1.PostedFile.InputStream.Length, Integer) 
    If iLength = 0 Then Exit Sub 'not a valid file 
    Dim sContentType As String = File1.PostedFile.ContentType 
    Dim sFileName As String, i As Integer 
    Dim bytContent As Byte() 
    ReDim bytContent(iLength) 'byte array, set to file size 

'strip the path off the filename ' 
i = InStrRev(File1.PostedFile.FileName.Trim, "\") 
If i = 0 Then 
    sFileName = File1.PostedFile.FileName.Trim 
Else 
    sFileName = Right(File1.PostedFile.FileName.Trim, Len(File1.PostedFile.FileName.Trim) - i) 
End If 

Try 
    File1.PostedFile.InputStream.Read(bytContent, 0, iLength) 
    With cmdInsertAttachment 
     .Parameters("@FileName").Value = sFileName 
     .Parameters("@FileSize").Value = iLength 
     .Parameters("@FileData").Value = bytContent 
     .Parameters("@ContentType").Value = sContentType 
     .ExecuteNonQuery() 
    End With 
Catch ex As Exception 
    'Handle your database error here 
    dbConn.Close() 
End Try 
Response.Redirect(Request.Url.ToString) 'Refresh page 
End Sub 

모두가이 부분에 제공하는 경우를 제외하고 잘 작동 - 모든 작동합니다,하지만 난 이미지를 업로드 조금 다른 코드가 필요하고, 내가 무엇을 잘 모릅니다 - 여기에 코드입니다

cmdinsertattachment와 함께 사용하지 않습니다. HTML 도구 상자에서 HTML (Input) (파일)을 사용하고 있습니다. 입력 파일의 ID는 ID = "upldimg"입니다.

INSERT into table1 (Img, Description) values (???, txtdescription.text) 

가 삽입 성명에서 내가 upldimg.text하지 마십시오 -

Column1 ID identity 
Column2 Img image 
Column 3 Description varchar(200). 

나에게 같은 삽입 문을 알려주세요 -

그래서 내가 어떻게 내 테이블에이 삽입합니까?

+0

당신은 질문을 편집 할 수 없었을 (http://stackoverflow.com 참조/questions/2150251/stuck-while-uploading-image-file-in-sql-server-2008-vb-net-code) – ErikE

답변

0
  1. 적절한 데이터 형식을 사용하십시오. IMAGE가 권장되지 않으며 대신 VARBINARY (MAX)를 사용하십시오.
  2. 임의의 이미지 크기에 바이트 배열을 할당하지 마십시오. 덩어리를 사용하십시오.
  3. 전체 파일의 데이터베이스 업로드를 기다리는 응답을 차단하지 마십시오. 나는이 작업을 수행 할 경우

, 나는 아예 임시 파일을 만드는 피하기 위해로, 동안은 HTTP 요청에서 수신되는 파일의 청크를 처리하기 위해 IIS 모듈을 사용합니다. 에이버리 단순한 접근 방식은 다음과 같을 것이다 :

create table Uploads (
    Id int identity(1,1) primary key 
    , FileName varchar(256) 
    , ContentType varchar(256) 
    , FileData varbinary(max)); 

와 영문 : 대신 drien의 derti로 로그인하기 때문에

protected void Page_Load(object sender, EventArgs e) 
    { 
     if (IsPostBack && FileUpload1.HasFile) 
     { 
      ThreadPool.QueueUserWorkItem(
       new WaitCallback(TransferToDatabase), FileUpload1); 
     } 
    } 

    protected void TransferToDatabase(object args) 
    { 
     try 
     { 
      Debug.Assert(args is FileUpload); 
      FileUpload upload = (FileUpload)args; 
      using (SqlConnection conn = new SqlConnection(
       Settings.Default.connString)) 
      { 
       conn.Open(); 
       using (SqlTransaction trn = conn.BeginTransaction()) 
       { 
        SqlCommand cmd = new SqlCommand(@" 
INSERT INTO Uploads(FileName, ContentType, FileData) 
VALUES (@FileName, @ContentType, @initialChunk); 
SET @id = SCOPE_IDENTITY();", conn, trn); 
        cmd.Parameters.AddWithValue("@FileName", upload.PostedFile.FileName); 
        cmd.Parameters.AddWithValue("@contentType", upload.PostedFile.ContentType); 
        SqlParameter paramId = new SqlParameter("@id", SqlDbType.Int); 
        paramId.Direction = ParameterDirection.Output; 
        cmd.Parameters.Add(paramId); 

        byte[] chunk = new byte[4096]; 
        int offset = upload.FileContent.Read(chunk, 0, 4096); 
        byte[] initialChunk = chunk; 
        if (offset < 4096) 
        { 
         // can't pass only part of a byte[] as parameter value 
         // must copy out the appropiate size 
         initialChunk = new byte[offset]; 
         Array.Copy(chunk, initialChunk, offset); 
        } 
        cmd.Parameters.AddWithValue("@initialChunk", initialChunk); 
        cmd.ExecuteNonQuery(); 

        // Add the rest of the data 
        if (offset == 4096) 
        { 
         SqlParameter paramChunk = new SqlParameter("@chunk", SqlDbType.VarBinary, 4096); 
         SqlParameter paramLength = new SqlParameter("@length", SqlDbType.BigInt); 
         SqlCommand cmdAddChunk = new SqlCommand(@" 
UPDATE Uploads 
    SET FileData.Write(@chunk, NULL, @length) 
WHERE id = @id", conn, trn); 
         cmdAddChunk.Parameters.AddWithValue("@id", paramId.Value); 
         cmdAddChunk.Parameters.Add(paramChunk); 
         cmdAddChunk.Parameters.Add(paramLength); 

         do 
         { 
          int chunkSize = upload.FileContent.Read(chunk, 0, 4096); 
          if (0 == chunkSize) 
          { 
           break; 
          } 
          paramChunk.Value = chunk; 
          paramLength.Value = chunkSize; 

          cmdAddChunk.ExecuteNonQuery(); 

          offset += chunkSize; 

         } while (true); 
        } 

        trn.Commit(); 
       } 
      } 
     } 
     catch (Exception e) 
     { 
      // Log to the appropiate error logging infrastructure 
      Debug.Write(e); 
     } 
    } 
관련 문제