我使用的是 restangular 1.51 和 angular 1.6。我的 html 看起来像这样
<input type="file" name="file" />
和 Angular 代码(基于讨论 here ):
let directive = {
..
link: (scope, element, attrs) => {
let inputElement = angular.element(element[0].querySelector('input'));
inputElement.bind('change', function () {
var formData = new FormData();
formData.append('file', inputElement[0].files[0]);
API.all('stores/csv').withHttpConfig({transformRequest: angular.identity}) .customPOST(formData,'' , undefined,
{ 'Content-Type': undefined }).then((response) => {console.log(response);
});
});
laravel 代码:
public function upload(Request $request)
{
$this->validate($request, [
'file' => 'required',
'type' => 'in:csv,xls,xlsx',
]);
$file = $request->file('file');
var_dump($file);
return response()->success(['file' => $file]);
}
这里的 $file 在 laravel 转储中显示为一个空数组。文档对此非常糟糕。想法?
更新
使用 postman 它工作得很好。这是 postman 生成的 curl :
postman curl :
curl -X POST \
http://127.0.0.1:8000/api/stores/csv \
-H 'Accept: application/x.toters.v1+json' \
-H 'Authorization: Bearer ***' \
-H 'Cache-Control: no-cache' \
-H 'Content-Type: application/x-www-form-urlencoded' \
-H 'Postman-Token: 4f9d2f3b-551b-aa47-4f65-98c7582f2919' \
-H 'content-type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW' \
-F file=@/Users/Shared/Download/bac-383-store-update.csv
postman 服务器日志
[2018-03-03 06:35:18] local.INFO: ----------------------------- [] []
[2018-03-03 06:35:18] local.INFO: POST api/stores/csv [] []
[2018-03-03 06:35:18] local.INFO: array ( 'file' => Illuminate\Http\UploadedFile::__set_state(array( 'test' => false, 'originalName' => 'bac-383-store-update.csv', 'mimeType' => 'text/csv', 'size' => 62, 'error' => 0, )), ) [] []
[2018-03-03 06:35:18] local.INFO: Status code: 200 [] []
[2018-03-03 06:35:18] local.INFO: User id: 104 [] []
这是restangular生成的 curl
restangular(两个请求 - 使用 chrome)curl:
curl 'http://127.0.0.1:8000/api/stores/csv'
-X OPTIONS
-H 'Access-Control-Request-Method: POST'
-H 'Origin: http://localhost:3000'
-H 'Accept-Encoding: gzip, deflate, br'
-H 'Accept-Language: en-US,en;q=0.9'
-H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36'
-H 'Accept: */*'
-H 'Connection: keep-alive'
-H 'Access-Control-Request-Headers: authorization,content-type'
--compressed
curl 'http://127.0.0.1:8000/api/stores/csv'
-H 'Origin: http://localhost:3000'
-H 'Accept-Encoding: gzip, deflate, br'
-H 'Accept-Language: en-US,en;q=0.9'
-H 'Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOjEwNCwiaXNzIjoiaHR0cDpcL1wvMTkyLjE2OC4wLjIzMjo4MDAwXC9hcGlcL3VzZXJzXC9sb2dpbiIsImlhdCI6MTUxOTk2OTAzNiwiZXhwIjoxNjE0NTc3MDM2LCJuYmYiOjE1MTk5NjkwMzYsImp0aSI6IndHV0UzRjhYQ3hRdDBGOWMifQ.XqySEIprbxtAU-RfhOgtFkScN1nUuuXEwMxCltfjqu8'
-H 'Content-Type: application/json'
-H 'Accept: application/x.toters.v1+json'
-H 'Referer: http://localhost:3000/?local/'
-H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36'
-H 'Connection: keep-alive'
--data-binary $'------WebKitFormBoundary9ApCHw2ykmLYK2IY\r\nContent-Disposition: form-data; name="file"; filename="bac-383-store-update.csv"\r\nContent-Type: text/csv\r\n\r\n\r\n------WebKitFormBoundary9ApCHw2ykmLYK2IY--\r\n' --compressed
restangular/chrome 服务器日志
[2018-03-03 06:34:52] local.INFO: ----------------------------- [] []
[2018-03-03 06:34:52] local.INFO: OPTIONS api/stores/csv [] []
[2018-03-03 06:34:52] local.INFO: array ( ) [] []
[2018-03-03 06:34:52] local.INFO: Status code: 200 [] []
[2018-03-03 06:34:52] local.INFO: ----------------------------- [] []
[2018-03-03 06:34:52] local.INFO: POST api/stores/csv [] []
[2018-03-03 06:34:52] local.INFO: array ( ) [] []
[2018-03-03 06:34:52] local.INFO: Status code: 200 [] []
[2018-03-03 06:34:52] local.INFO: User id: 104 [] []
更新 2:
比较两个 curls 之间的 header 后,我注意到内容类型不同:
postman curl 片段
-H 'Content-Type: application/x-www-form-urlencoded' \
restangular curl 片段
-H 'Content-Type: application/json'
考虑到长方形的人 PROMISED,这令人震惊通过使用上述语法,内容类型应为 application/x-www-form-urlencoded
:
Restangular.all('users') .withHttpConfig({transformRequest: angular.identity}) .customPOST(formData, undefined, undefined, { 'Content-Type': undefined }); This basically tells the request to use the Content-Type: multipart/form-data as the header.
所以我这样写:
API.all('stores/csv').withHttpConfig({transformRequest: angular.identity})
.customPOST(formData, undefined, undefined,
{ 'Content-Type': 'application/x-www-form-urlencoded' }).then((response) => {console.log(response);
这稍微改善了一些..现在比较两个卷发:
postman
curl -X POST \
http://127.0.0.1:8000/api/stores/csv \
-H 'Accept: application/x.toters.v1+json' \
-H 'Authorization: Bearer ***' \
-H 'Cache-Control: no-cache' \
-H 'Content-Type: application/x-www-form-urlencoded' \
-H 'Postman-Token: 4f9d2f3b-551b-aa47-4f65-98c7582f2919' \
-H 'content-type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW' \
-F file=@/Users/Shared/Download/bac-383-store-update.csv
有 Angular 的
curl 'http://127.0.0.1:8000/api/stores/csv'
-H 'Origin: http://localhost:3000'
-H 'Accept-Encoding: gzip, deflate, br'
-H 'Accept-Language: en-US,en;q=0.9'
-H 'Authorization: Bearer ***
-H 'Content-Type: application/x-www-form-urlencoded'
-H 'Accept: application/x.toters.v1+json'
-H 'Referer: http://localhost:3000/?local/'
-H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36'
-H 'Connection: keep-alive'
--data $'------WebKitFormBoundaryd405EnTxpFJv2GDN\r\nContent-Disposition: form-data; name="file"; filename="bac-383-store-update.csv"\r\nContent-Type: text/csv\r\n\r\n\r\n------WebKitFormBoundaryd405EnTxpFJv2GDN\r\nContent-Disposition: form-data; name="name"\r\n\r\nfile\r\n------WebKitFormBoundaryd405EnTxpFJv2GDN--\r\n'
--compressed
所以我仍然没有发送-F
option
最佳答案
我之前没有接触过 restangular,但是在 Laravel 中,当你想从请求中获取文件时,你需要在请求对象上使用 file
方法:
$file = $request->file('file');
那应该给你一个 Illuminate\Http\UploadedFile
关于angularjs - 如何使用 CORS 以 Angular 上传文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49077674/