Unable to cast object of type 'System.Web.Http

2020-07-02 11:56发布

问题:

I have met an issue regarding the casting type from HttpInputStream to FileStream.

How I did ?

I have a HttpPostedFileBase object and I want to have FileStream.

I wrote:

public void Test(HttpPostedFileBase postedFile) {
  FileStream fileStream = (FileStream)(postedFile.InputStream); // throw exception

  FileStream anotherFileStream = postedFile.InputStream as FileStream; // null
}

I tried also

public void Test(HttpPostedFileBase postedFile) {
  Stream stream = postedFile.InputStream as Stream;

  FileStream myFile = (FileStream)stream;

}

But no success.

Why at postedFile.InputStream comes HttpInputStream type ?

And how could I solve this issue ?

Thanks

回答1:

The stream that you get from your HTTP call is read-only sequential (non-seekable) and the FileStream is read/write seekable. You will need first to read the entire stream from the HTTP call into a byte array, then create the FileStream from that array.



回答2:

public byte[] LoadUploadedFile(HttpPostedFileBase uploadedFile)
{
    var buf = new byte[uploadedFile.InputStream.Length];
    uploadedFile.InputStream.Read(buf, 0, (int)uploadedFile.InputStream.Length);
    return buf;
}


回答3:

I used the following and it worked just fine for the same situation

MemoryStream streamIWant = new MemoryStream();
using (Stream mystream = (Stream)AmazonS3Service.GetObjectStream(AWSAlbumBucketName, ObjectId))                                                            
{
    mystream.CopyTo(streamIWant);
}
return streamIWant;

The GetObjectStream returns the same type of string mentioned in the question.



回答4:

You can use the .SaveAs method to save the file content. HttpInputSteam probably because it's uploaded through http [browser]

 postedFile.SaveAs("Full Path to file name");

You can also use CopyTo

FileStream f = new FileStream(fullPath, FileMode.CreateNew);
postedFile.InputStream.CopyTo(f);
f.Close();


回答5:

Below code worked for me..

Use a BinaryReader object to return a byte array from the stream like:

byte[] fileData = null;
using (var binaryReader = new BinaryReader(Request.Files[0].InputStream))
{
    fileData = binaryReader.ReadBytes(Request.Files[0].ContentLength);
}

How to create byte array from HttpPostedFile