2013-06-14 1 views
2

Моя проблема в том, что я хочу восстановить файл, который посылает мне сервер, с помощью WebRequest. С помощью этого потока я хочу создать файл И сохранить файл в базе данных (переменная varbinary (MAX)). Как я могу это сделать? Мой запрос: HttpWebRequest WebRequest = WebRequest.Create("https://test.website.fr/website/api/test/") as HttpWebRequest;Как восстановить и создать файл из WebRequest и записать его в базу данных (C#)?

Благодаря Iris

ответ

2

Я нашел решение вчера: D. В следующем коде объясняется, как восстановить файл из потока, как записать его в базу данных, как получить файл из базы данных и как создать файл из него. Вы можете напрямую написать файл! («Основной» функция «Скачать()»

private void Download() 
{ 
    //Create de request 
    HttpWebRequest webRequest = WebRequest.Create("https://test.website.fr/website/api/test/") as HttpWebRequest; 

    webRequest.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.1) Gecko/2008070208 Firefox/3.0.1"; 
    webRequest.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"; 

    //encode to Base64 
    string sAuthorization = "username:password"; 
    byte[] toEncodeAsBytes = System.Text.ASCIIEncoding.ASCII.GetBytes(sAuthorization); 
    string returnValue = System.Convert.ToBase64String(toEncodeAsBytes); 

    //Add authentification to request's header 
    webRequest.Headers.Add("Authorization: Basic " + returnValue); 

    try 
    { 
     //Get response 
     HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse(); 
     Stream input = webResponse.GetResponseStream(); //Store the response in a Stream 

     //Transform stream to byte array 
     byte[] tabTempTest = ReadFully(input); 
     int i = tabTempTest.Length; 

     WitreToDatabase(tabTempTest, i); 



     //At this moment, your file is write in database !!! 
     //Then i'll go to get this file from database 

     //my param idFile indicate the file in the db 
     int idFile = 6; 
     byte[] fileFromDatabase = GetFileFromDB(idFile); 

     //Here, your file is store in the byte array. 
     //Now, just write this in a file 

     //Convert to a Stream 
     Stream newStream = new MemoryStream(fileFromDatabase); 

     //Create the file 
     using (Stream file = File.OpenWrite("NewFile.pdf")) 
     { 
      CopyStreamToFile(newStream, file); 
     } 

     //Clore the procedure 
     webRequest.GetResponse().Close(); 
    } 
    catch (WebException ex) 
    { 
     int iRetourcode = 0; 
     if (ex.Status == WebExceptionStatus.ProtocolError) 
     { 
      var response = ex.Response as HttpWebResponse; 
      if (response != null) 
      { 
       iRetourcode = (int)response.StatusCode; 
      } 
      else 
      { 
       // no http status code available 
      } 
     } 
     else 
     { 
      // no http status code available 
     } 
    } 
} 

Эта функция сохраняет поток в массив байтов:

public static byte[] ReadFully(Stream input) 
{ 
    byte[] buffer = new byte[16 * 1024]; 
    using (MemoryStream ms = new MemoryStream()) 
    { 
     int read; 
     while ((read = input.Read(buffer, 0, buffer.Length)) > 0) 
     { 
      ms.Write(buffer, 0, read); 
     } 
     return ms.ToArray(); 
    } 
} 

функция WriteToDatabase хранит массив байтов (файл) в базе данных:

public static void WitreToDatabase(byte[] tabTempTest, int i) 
{ 
    //First method to execute SQL procedure 
    string queryStmt = "INSERT INTO dbo.DOCUMENT(DOC_CONTENU, DOC_LENGTH) VALUES(@CONTENU, @LENGTH)"; //Store length it's to easy for future 
    using (SqlConnection _con = new SqlConnection("Data Source=SERVER_NAME;Initial Catalog=THOMAS;User ID=id;Password=pass")) 
    using (SqlCommand _cmd = new SqlCommand(queryStmt, _con)) 
    { 
     SqlParameter param = _cmd.Parameters.Add("@CONTENU", SqlDbType.VarBinary); 
     SqlParameter param2 = _cmd.Parameters.Add("@LENGTH", SqlDbType.Int); 
     param.Value = tabTempTest; 
     param2.Value = i; 

     _con.Open(); 
     _cmd.ExecuteNonQuery(); 
     _con.Close(); 
    } 
} 

Получить массив байтов (файл) из базы данных:

public static byte[] GetFileFromDB(int idFile) 
{ 
    int length = 0; 
    //Second method to execute SQL procedure 
    DataSet ds = SqlHelper.ExecuteDataset("Data Source=SERVER_NAME;Initial Catalog=THOMAS;User ID=id;Password=pass", "GetFile", idFile); 

    /* 
     StoredProcedure : 
     SELECT DOC_CONTENU, DOC_LENGTH FROM THOMAS.dbo.DOCUMENT WHERE DOC_ID = @ID_FILE 
    */ 
    foreach (DataRow dr in ds.Tables[0].Rows) 
    { 
     length = Convert.ToInt32(dr["DOC_LENGTH"]); 
    } 

    byte[] tabFile = new byte[length]; 

    foreach (DataRow dr in ds.Tables[0].Rows) 
    { 
     tabFile = (byte[])dr["DOC_CONTENU"]; 
    } 
    return tabFile; 
} 

Запись в файле:

public static void CopyStreamToFile(Stream input, Stream output) 
{ 
    byte[] buffer = new byte[8 * 1024]; 
    int len; 
    while ((len = input.Read(buffer, 0, buffer.Length)) > 0) 
    { 
     output.Write(buffer, 0, len); 
    } 
} 

Я надеюсь, что этот код поможет вам! Thomas B.

+0

О, спасибо большое! Это идеально для меня! Спасибо тоже за комментарии. – user2471450

Смежные вопросы