застрял при загрузке файла изображения на сервере SQL через VB.net - PullRequest
0 голосов
/ 28 января 2010

Повторное размещение того же вопроса, потому что после публикации не удалось отредактировать вопрос.пожалуйста, прочтите нижнюю часть, особенно, если вы читали этот вопрос раньше -

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

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  

все работает отлично, за исключением того, что касается этой части -

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

Я не использую с cmdinsertattachment.Я использую Html - Input (File) из панели инструментов HTML.идентификатор входного файла - ID = "upldimg".

так как мне вставить это в мою таблицу, которая является -

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

, пожалуйста, скажите мне оператор вставки как -

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

Должен ли я делать upldimg.textв операторе вставки?

1 Ответ

0 голосов
/ 28 января 2010
  1. Используйте подходящие типы данных. ИЗОБРАЖЕНИЕ устарело, используйте VARBINARY (MAX) вместо
  2. Не выделяйте байтовые массивы для изображений произвольного размера. Используйте куски.
  3. Не блокируйте ответ, чтобы дождаться загрузки базы данных всего файла.

Если бы я это сделал, я бы использовал модуль IIS для обработки фрагмента файла при получении в HTTP-запросе, чтобы вообще не создавать временный файл. Очень упрощенный подход выглядел бы так:

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

и aspx:

    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);
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...