Http 请求:写入没有 headers 的二进制文本文件(或图像),文件名来自 content-disposition
Http request: Writing binary text file (or image) without headers with filename from content-disposition
我正在通过 RestSharp 将文件 (bytearray) 添加到 post 数据,并将其发送到 node.js 快速服务器。我想用 content-disposition 中的文件名写入文件。
我的第一个问题是,当使用 fs 将数据写入文件时,它还会用一些 header 信息编写一个包装器:
-------------------------------28947758029299
Content-Disposition: form-data; name="file"; filename="test.txt"
Content-Type: application/octet-stream
Hello from c#
-------------------------------28947758029299--
另一个问题是,尽管它将它写入文件,Content-Disposition 似乎不是 header 的一部分 object:
[ 'content-type',
'accept',
'x-forwarded-port',
'user-agent',
'accept-encoding',
'content-length',
'host',
'x-forwarded-for' ]
我能想到的唯一解决方案是,临时写入文件并使用正则表达式提取我需要的内容,但我认为这会损坏图像文件,而且是因为我没有正确理解 http 请求而不是合法请求解决方案。我对 C# 和节点都很陌生,所以它是从我在网上找到的例子拼凑而成的:
这是我的 C# 代码:
public ActionResult Documents(HttpPostedFileBase file)
{
if (ModelState.IsValid)
{
if (file == null)
{
ModelState.AddModelError("File", "Please Upload Your file");
}
else if (file.ContentLength > 0)
{
var fileName = Path.GetFileName(file.FileName);
var inputStream = file.InputStream;
System.IO.Stream MyStream;
int FileLen = file.ContentLength;
byte[] input = new byte[FileLen];
// Initialize the stream.
MyStream = file.InputStream;
// Read the file into the byte array.
MyStream.Read(input, 0, FileLen);
var client = new RestClient("http://128.199.53.59");
var request = new RestRequest(Method.POST);
request.AddHeader("Content-Type", "application/octet-stream");
request.AddFile("file", input, fileName, "application/octet-stream");
RestResponse response = (RestResponse)client.Execute(request);
ModelState.Clear();
ViewBag.Message = "File uploaded successfully";
}
}
}
这是我的相关 node.js:
app.post('/', function(request, response){
var fileData = [];
var size = 0;
request.on('data', function (chunk) {
size += chunk.length;
fileData.push(chunk);
})
request.on('end', function(){
var buffer = Buffer.concat(fileData);
fs.writeFile('logo.txt', buffer, 'binary', function(err){
if (err) throw err
})
})
});
您需要使用 multipart/form-data
解析器。对于 Express,有 multer
, multiparty
, and formidable
.
如果您想将传入的文件作为流处理而不是始终将它们保存到磁盘,您可以使用 busboy
/connect-busboy
(busboy
是 multer
的强大功能)。
我正在通过 RestSharp 将文件 (bytearray) 添加到 post 数据,并将其发送到 node.js 快速服务器。我想用 content-disposition 中的文件名写入文件。 我的第一个问题是,当使用 fs 将数据写入文件时,它还会用一些 header 信息编写一个包装器:
-------------------------------28947758029299
Content-Disposition: form-data; name="file"; filename="test.txt"
Content-Type: application/octet-stream
Hello from c#
-------------------------------28947758029299--
另一个问题是,尽管它将它写入文件,Content-Disposition 似乎不是 header 的一部分 object:
[ 'content-type',
'accept',
'x-forwarded-port',
'user-agent',
'accept-encoding',
'content-length',
'host',
'x-forwarded-for' ]
我能想到的唯一解决方案是,临时写入文件并使用正则表达式提取我需要的内容,但我认为这会损坏图像文件,而且是因为我没有正确理解 http 请求而不是合法请求解决方案。我对 C# 和节点都很陌生,所以它是从我在网上找到的例子拼凑而成的:
这是我的 C# 代码:
public ActionResult Documents(HttpPostedFileBase file)
{
if (ModelState.IsValid)
{
if (file == null)
{
ModelState.AddModelError("File", "Please Upload Your file");
}
else if (file.ContentLength > 0)
{
var fileName = Path.GetFileName(file.FileName);
var inputStream = file.InputStream;
System.IO.Stream MyStream;
int FileLen = file.ContentLength;
byte[] input = new byte[FileLen];
// Initialize the stream.
MyStream = file.InputStream;
// Read the file into the byte array.
MyStream.Read(input, 0, FileLen);
var client = new RestClient("http://128.199.53.59");
var request = new RestRequest(Method.POST);
request.AddHeader("Content-Type", "application/octet-stream");
request.AddFile("file", input, fileName, "application/octet-stream");
RestResponse response = (RestResponse)client.Execute(request);
ModelState.Clear();
ViewBag.Message = "File uploaded successfully";
}
}
}
这是我的相关 node.js:
app.post('/', function(request, response){
var fileData = [];
var size = 0;
request.on('data', function (chunk) {
size += chunk.length;
fileData.push(chunk);
})
request.on('end', function(){
var buffer = Buffer.concat(fileData);
fs.writeFile('logo.txt', buffer, 'binary', function(err){
if (err) throw err
})
})
});
您需要使用 multipart/form-data
解析器。对于 Express,有 multer
, multiparty
, and formidable
.
如果您想将传入的文件作为流处理而不是始终将它们保存到磁盘,您可以使用 busboy
/connect-busboy
(busboy
是 multer
的强大功能)。