4

Web フォーム アプリケーションで実行するのが非常に簡単なことについて、多くの発見された例に何時間も費やしましたが、成功しませんでした。つまり、1 つ以上のファイルをアップロードして、SQL サーバーに保存します。

Webフォーム(vb.net)では、これを行うことができます:

Dim fs As Stream = fileUpload1.PostedFile.InputStream
        Dim br As New BinaryReader(fs)
        Dim bytes As Byte() = br.ReadBytes(fs.Length)

        'insert the file into database
        Dim strQuery As String = "INSERT INTO files ([name], [type], [file]) VALUES (@Name, @ContentType, @Data)"
        Dim cmd As New SqlCommand(strQuery)

        cmd.Parameters.Add("@Name", SqlDbType.VarChar).Value = filename
        cmd.Parameters.Add("@ContentType", SqlDbType.VarChar).Value() = contenttype
        cmd.Parameters.Add("@Data", SqlDbType.Binary).Value = bytes

次に、データベース実行ステートメントを実行します...完了!

C# Web-API:

Web-Api を介してアップロードをファイルシステムに保存する、私が今持っている一見良い例は次のとおりです。

public Task<IEnumerable<FileDesc>> Old()
    {
        string folderName = "uploads";
        string PATH = HttpContext.Current.Server.MapPath("~/" + folderName);
        string rootUrl = Request.RequestUri.AbsoluteUri.Replace(Request.RequestUri.AbsolutePath, String.Empty);

        if (Request.Content.IsMimeMultipartContent())
        {
            var streamProvider = new MultipartFormDataStreamProvider(PATH);
            var task = Request.Content.ReadAsMultipartAsync(streamProvider).ContinueWith<IEnumerable<FileDesc>>(t =>
            {
                if (t.IsFaulted || t.IsCanceled)
                {
                    throw new HttpResponseException(HttpStatusCode.InternalServerError); 
                }
                var fileInfo = streamProvider.FileData.Select(i =>
                {
                    var info = new FileInfo(i.LocalFileName);
                    return new FileDesc(info.Name, rootUrl + "/" + folderName + "/" + info.Name, info.Length / 1024);
                });
                return fileInfo;
            });
            return task;
        }
        else
        {
            throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.NotAcceptable, "This request is not properly formatted"));
        }
    }

データベースに送信できるように、各マルチパート ファイル コンテンツ ストリームを取得する方法がわかりません。MultipartMemoryStreamProvider と MultipartStreamProvider について話している投稿を見たことがありますが、それらの使用方法がわかりません。C# と Web-Api の初心者として、私は明らかに頭がいっぱいです。

データベースに送信するバイトを取得できるストリームにファイルの内容を取得する方法を教えてもらえますか?

4

1 に答える 1

1

この問題に遭遇したときの私の解決策は次のとおりです。

クライアント:

 public async Task UploadImage(byte[] image, string url)
        {
            Stream stream = new System.IO.MemoryStream(image);
            HttpStreamContent streamContent = new HttpStreamContent(stream.AsInputStream());

            Uri resourceAddress = null;
            Uri.TryCreate(url.Trim(), UriKind.Absolute, out resourceAddress);
            Windows.Web.Http.HttpRequestMessage request = new Windows.Web.Http.HttpRequestMessage(Windows.Web.Http.HttpMethod.Post, resourceAddress);
            request.Content = streamContent;

            var httpClient = new Windows.Web.Http.HttpClient();
            var cts = new CancellationTokenSource();
            Windows.Web.Http.HttpResponseMessage response = await httpClient.SendRequestAsync(request).AsTask(cts.Token);
        }

コントローラ:

public async Task<HttpResponseMessage> Post()
{
    Stream requestStream = await this.Request.Content.ReadAsStreamAsync();
    byte[] byteArray = null;
    using (MemoryStream ms = new MemoryStream())
    {
        await requestStream.CopyToAsync(ms);
        byteArray = ms.ToArray();
    }
    .
    .
    .
    return Request.CreateResponse(HttpStatusCode.OK);
}
于 2014-08-01T09:52:53.463 に答える