查询文件上传

时间:2016-08-05 07:01:00

标签: javascript c# jquery asp.net file-upload

我正在使用“文件上传”控件和C#编码(后端)在我的网络应用程序中上传文件(.jpeg / .png / .pdf)。 通过此控件上传的文件应保存在服务器中。 一切正常,但我遇到的问题是当保存了xlsx或doc的文件类型并且该文件的扩展名更改为.png或.jpeg并且正在上载时,它正被上传到服务器而没有任何错误

当我尝试在服务器中打开该图像或pdf文件时,通常显示错误消息,文件无法打开。

我已经完成了扩展验证,但在这种情况下它没有显示任何效果。

任何人都可以帮我摆脱这个问题。(无论是C#编码还是Jquery或javascript都可以)

4 个答案:

答案 0 :(得分:0)

修改,更新

  

但我的问题是扩展是我需要上传的正确扩展   但文件类型不是我的意思是可以保存excel表   扩展jpeg

您可以使用FileReader.readAsBinaryString()来检查文件标头;例如,JFIF .jpeg.jpg; PNG的{​​{1}}; .png的{​​{1}}; PDF .pdf RegExp.prototype.test()

RegExp

使用/JFIF|PNG|PDF/元素的accept属性,将值设置为<input type="file">,以排除扩展名不仅仅是".jpeg,.jpg, .png,.pdf".jpeg.jpg的文件或.png用户可以在.pdf对话框中选择。{/ p>

&#13;
&#13;
Choose File
&#13;
document.querySelector("input[type=file]")
  .addEventListener("change", function(e) {
    console.log(e.target.files[0].type);
    var reader = new FileReader();
    reader.onload = function(event) {
      console.log(event.target.result
                  , /JFIF|PNG|PDF/.test(event.target.result))
    }
    reader.readAsBinaryString(e.target.files[0])
  })
&#13;
&#13;
&#13;

答案 1 :(得分:0)

您能告诉我们验证的样子吗? 有两种方法可以检查要上载的文件的扩展名。它应该是这样的:

//In your aspx file :
<asp:FileUpload ID="FileUploadControl" runat="server"/>
<asp:Button runat="server" id="Btn_Upload" text="Upload" onclick="Btn_Upload_Click" />

//In your aspx.cs file :
// First soluce
protected void Btn_Upload_Click(object sender, EventArgs e)
{
     if (FileUploadControl.PostedFile.ContentType != "application/pdf")
     {
          //Not an PDF
     }
}

// Second soluce :
protected void Btn_Upload_Click(object sender, EventArgs e)
{
     string extension = Path.GetExtension(FileUploadControl.PostedFile.FileName);
     if (extension != ".pdf")
     {
          //Not an PDF
     }
 }

当然,在这些代码示例中,您可以为JPEG / PNG / ...

添加例外

答案 2 :(得分:0)

以下是我最终能够使用“标题代码”进行验证的方法:

 System.IO.BinaryReader r = new System.IO.BinaryReader(FileUpload1.PostedFile.InputStream);
                                string fileclass = "";
                                byte buffer;
                                try
                                {
                                    buffer = r.ReadByte();
                                    fileclass = buffer.ToString();
                                    buffer = r.ReadByte();
                                    fileclass += buffer.ToString();
                                }
                                catch
                                {
                                }
                                r.Close();
                                if (fileclass != "3780" || fileclass != "255216" || fileclass != "13780")    /*Header codes (3780-PDF);(255216-JPG,JPEG);(13780-PNG)*/
                                  {
                                    /*Your code goes here(things to do with the file uploaded)*/
                                  }

要获取其他文件格式的值,请尝试上传文件并设置断点并获取标题代码。

答案 3 :(得分:0)

有很多图像格式,例如webp为什么不支持它们? 您可以在使用画布上传它们之前将它们转换为客户端...

function convertImage(image, mimetype, quality) {
  return new Promise(function(resolve){
    var canvas = document.createElement('canvas')
    canvas.width = image.width
    canvas.height = image.height
    canvas.getContext("2d").drawImage(image, 0, 0)
    canvas.toBlob(resolve, mimetype, quality)
  })
}

if(input.files[0].type === 'application/pdf') {
  // upload directly (not a image)
} else {
  var img = new Image
  img.onerror = function() { /* not an image */}
  img.onload = function() {
    convertImage(img, 'image/png', 1).then(function(blob){
      // upload the converted image
      fetch('upload', {method: 'POST', body: blob})
    })
  }
  img.src = URL.createObjectURL(input.files[0])
}

然后您使用它来帮助过滤掉您想要的接受文件

<input type="file" accept="application/pdf, image/*">