5

私は、クライアントが www.site1.com から画像をアップロードし、画像の URL をデータベースに保存し、画像を www.site2.com/images のファイルに保存できるようにする機能の構築に取り組んできました。ファイルを目的の場所にアップロードできましたが、画像を開いて表示しようとすると、エラーが含まれていると言われます。私は実際に画像を扱う必要がなかったので、途方に暮れています。

これは、ファイルのアップロードに使用される方法です。

public static void UpLoadImage(Stream image, string target)
    {
        FtpWebRequest req = (FtpWebRequest)WebRequest.Create("ftp://www.site2.com/images/" + target);
        req.UseBinary = true;
        req.Method = WebRequestMethods.Ftp.UploadFile;
        req.Credentials = new NetworkCredential("myUser", "myPass");
        StreamReader rdr = new StreamReader(image);
        byte[] fileData = Encoding.UTF8.GetBytes(rdr.ReadToEnd());

        rdr.Close();
        req.ContentLength = fileData.Length;
        Stream reqStream = req.GetRequestStream();
        reqStream.Write(fileData, 0, fileData.Length);
        reqStream.Close();
    }

これは、メソッドが呼び出される場所です (image1 は HttpPostedFileBase です)。

myObject.UpLoadImage(image1.InputStream, storedTL.ID + "-1.png");

このコードを機能させる方法がある場合、またはこれを行うためのより良い方法がある場合は、助けてください。

4

2 に答える 2

10

StreamReader は、テキストを読み取るためのものです。

変化する:

StreamReader rdr = new StreamReader(image);
byte[] fileData = Encoding.UTF8.GetBytes(rdr.ReadToEnd());

byte[] fileData = File.ReadAllBytes(image);
于 2012-09-12T02:28:27.693 に答える
0

古い質問ですが、今日はこの問題で時間を失いました。ReadAllBytesを使用することはできませんでした。そのため、Streams のみを処理する必要がありました。ここでいくつかの調査を行った後、私の解決策に到達する方法は次のとおりです。

    public void UploadToFTP(Stream stream, string ftpPath)
    {
        Stream requestStream = null;

        try
        {

            Uri uri = GetServerUri(ftpPath);

            FtpWebRequest request = Connect(uri); //here I set user/pwd/etc
            request.UseBinary = true;
            request.Method = WebRequestMethods.Ftp.UploadFile;
            request.ContentLength = stream.Length;

            requestStream = request.GetRequestStream();

            //Avoid to write zero length files in destiny. 
            //If you have read the stream before for any reason (as a convertion to Bitmap to extract dimensions, for example)
            stream.Seek(0, SeekOrigin.Begin);

            stream.CopyTo(requestStream);

        }
        catch (WebException ex)
        {
            //do something
        }
        finally
        {
            if (requestStream != null)
                requestStream.Close();

        }
    }
于 2016-09-21T01:35:56.130 に答える