c# - 如何从 WebRequest 恢复和创建文件并将其写入数据库(C#)?

标签 c# database file webrequest recover

我的问题是我想恢复服务器通过 WebRequest 发送给我的文件。通过这个流,我想创建一个文件并将该文件存储在数据库中(varbinary(MAX)变量)。 我怎样才能做到这一点 ? 我的请求: HttpWebRequest webRequest = WebRequest.Create("https://test.website.fr/website/api/test/") as HttpWebRequest;

谢谢 鸢尾花

最佳答案

我昨天找到了解决方案:D。 以下代码解释了如何从流中恢复文件、如何将其写入数据库、如何从数据库获取文件以及如何从中创建文件。直接写入文件即可! (“主要”函数是“Download()”

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);
    }
}

希望这段代码能对您有所帮助! 托马斯·B.

关于c# - 如何从 WebRequest 恢复和创建文件并将其写入数据库(C#)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17103024/

相关文章:

file - 当我使用 int 21h 函数时,我的 asm 代码写入垃圾字节

c# - 如何刷新/重新加载桌面

c++ - Mysql 与 C++ 不工作

php - 一个帖子属于多个企业

c++ - 为什么这段代码总是返回零文件大小?

python - 使用 python 在文件中的关键字之间查找值

c# - PayPal 集成 (IPN) - 真的有可能吗?

c# - 更新 wpf 中的 UI 元素

c# - 如何对任意大数字的 List<String> 进行排序?

sql-server - 数据库中的所有表都应该相关还是可以保留其中的一些表?